Logo Search packages:      
Sourcecode: mazeofgalious version File versions  Download package

gamecycle.cpp

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "SDL/SDL.h"
#include "SDL_image.h"
#include "SDL_mixer.h"
#include "sound.h"
#include "MOGtypes.h"

#include "drawing.h"
#include "bitmaps.h"
#include "sprites.h"
#include "tiles.h"

#include "mog.h"
#include "object.h"

/* Paths: */ 


#ifndef _WIN32
#ifndef HAVE_STRUPR

char *strupr (char *str)
{
      char *ptr;
      
      ptr = str;
      while (*ptr)
      {
            *ptr = toupper (*ptr);
            ptr++;
      }
      return str;
}


#endif
#endif

extern char **g_paths;
extern int n_g_paths,act_g_path;
extern char *g_path;
extern char **s_paths;
extern int n_s_paths,act_s_path;
extern char *s_path;

/* Gráficos: */ 
Bitmap *konami_bmp=0,*menu_bmp=0,*tiles_bmp=0,*tiles2_bmp=0,*enemy_bmp=0,*enemy2_bmp=0,*final_bmp=0;
int n_tiles=0;
CTile **tiles=0;

BYTE *col_buffer=0;

/* Estado: */ 
int STATE=0,SUBSTATE=0,OLDSTATE=0,MENUOPTION=0;
int cycle=0;

/* Developers variables: */ 
int developer_start_x=-1,developer_start_y=-1,developer_start_map=-1;

/* Juego: */ 
int inter_screen=0;
int frame_counter=0;
bool pause=false;

int pause_state=0;
int map=0;              /* En que mundo está el personaje               */ 
int map_x=0,map_y=0;    /* En que habitación dentro del mundo           */ 
int pers_x=0,pers_y=0;  /* Posición del personaje en la habitación      */ 
int pers_pos=0;
bool pers_right=true;   /* Hacia donde mira el personaje                */ 
int pers_state=0;       /* Estado en el que se encuentra el personaje   */ 
int pers_substate=0;    /* Variable de estado secundaria.               */ 
int pers_walk_state=0;  /* Variable que controla el caminar.      */ 
int jump_inertia=0;
bool sword=false;                   /* Hay que dibujar la espada? */ 
bool old_sword=false;
int sword_x=0,sword_y=0;      /* Coordenadas de la espada.  */ 
int sword_time=0;
int in_ladder=-1;             /* En qué escalera está el personaje      */ 
bool previous_x_collision=false;    /* Hubo una colisión en X en el frame anterior? */ 
bool previous_y_collision=false;    /* Hubo una colisión en Y en el frame anterior? */ 
int hit_time=0;   /* Contador para saber cuando pueden dañarnos de nuevo      */ 
int character=0;  /* Personaje seleccionado     */ 
bool live_character[2]={true,true}; /* Si los personajes están vivos o muertos */ 
bool can_revive_character[2]={true,true}; /* Si los personajes pueden revivir otra vez o no */ 
int current_weapon=-1;  /* arma seleccionada */ 
int n_fired_arrows=0;   /* Nº de flechas activas      */ 
int n_fired_mines=0;    /* Nº de flechas activas      */ 
int in_door=-1; /* Objeto en el que está la puerta en la que se acaba de entrar     */ 
int freezed=0;    /* Controla si el protagonista está congelado */ 
bool in_water=false;    /* Indica si el personaje está dentro del agua o no */ 
bool in_lava=false;
int water_counter=0;    /* Indica cuanto tiempo hace de que un personaje entró en el agua */ 
int lava_counter=0;     /* Indica cuanto tiempo hace de que un personaje entró en la lava */ 
bool mine_stepped=false;
bool item[38];    /*  0 - 29  : items     */ 
                        /* 30 - 31  : escudos de bronce y plata */ 
                        /* 32 - 37  : armas     */ 
bool world_item[10][4];
bool cross=false,world_key=false;
int next_world=0;
bool world_doors_open[10];
int world_key_item=0;
int to_enter_cut=0;     /* Controla los cortes que sufre el personaje al      */ 
                              /* entrar por las puertas.                                        */ 
int currently_selecting=0;    /* Sirve para saber si se está seleccionando    */ 
                                          /* personaje o arma.                                        */ 
bool shop_item[3];
int passage_state=0;
unsigned char old_keyboard[SDLK_LAST]={
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      
      0,0};
int stone_hit_counter=0;      /* Sirve para acelerar el movimiento de la espada cuando    */ 
                                          /* Aprodite está rompiedo rocas.                                        */ 
int bible_counter=0,bible_subcounter=0;
bool ZEUS_password=false,ZEUS_used=false;

bool room_slimes=false; /* Indica si en esta habitacion hay orugas o no.      */ 
int room_waterdragons=-1;
int room_reddragon=0;
int slime_counter=0;
bool room_watermonster=false; /* Indica que hay monstruo en el agua.    */ 
bool room_fallingstones=false,room_rollingstones=false; /* Indica si caen piedras */ 
int stones_counter=0;
bool room_blobs=false;  /* Indica si hay bichos rojos que suben   */ 
bool room_demonroom=false,old_room_demonroom=false;   /* Indica si es la habitación de un monstruo. */ 
int world5_room44_state=0,world5_room44_state2=0,world5_room44_state3=0;
int world5_room64_state=0;
int world6_room35_state=0;
int world7_room12_state=0;
int world8_room12_state=0;
int room26_state=0,room56_state=0;
int room_bfly=0;
int room_fairy=-1;
int room_appearwall=-1;
int room_appearwall_x=0,room_appearwall_y=0;
int appearwall_record_x[MAX_AW_RECORD]={-1,-1,-1,-1,-1,-1,-1,-1,
                                                            -1,-1,-1,-1,-1,-1,-1,-1,
                                                            -1,-1,-1,-1,-1,-1,-1,-1,
                                                            -1,-1,-1,-1,-1,-1,-1,-1};
int appearwall_record_y[MAX_AW_RECORD]={-1,-1,-1,-1,-1,-1,-1,-1,
                                                            -1,-1,-1,-1,-1,-1,-1,-1,
                                                            -1,-1,-1,-1,-1,-1,-1,-1,
                                                            -1,-1,-1,-1,-1,-1,-1,-1};
int fairy_x=0,fairy_y=0;
int fighting_demon=0;
int watermonster_state=0;
int world3_room06_counter=0;
int world4_state=0;
int world10_door_x=-1,world10_door_y=-1;
bool room_lava=false;
int lava_state=0;
bool room_piranhas=false;
int piranhas_counter=0;
int room_birds=-1;

int n_arrows=0,n_coins=0,n_keys=0;
int player_energy[2],player_experience[2],player_max[2];
int player_denergy[2],player_dexperience[2];

int room_size_x=0,room_size_y=0;
int *room_tiles=0;
bool jumping_from_elevator=false;
bool character_over_vertical_lever=false;


/* Objetos: (escaleras, piedras, etc...) */ 
MOGObject object[MAX_OBJECTS];
int n_objects;
 
int wall_tile;
int stone_tile,ladder_tile,wdoor_tile,keydoor_tile,stats_tile;
int coin_tile,arrow_tile,key_tile,door_tile;
int character_tile[3],character_tile_inv[3],colision_tile;
int pause_tile[2];
int sword_tile[2],explosion_tile;
int worm_tile,bat_tile,skeleton_tile,smoke_tile,slime_tile,bouncingball_tile;
int watermonster_tile,jumpingbush_tile,bluespider_tile,whitefireball_tile;
int fstone_tile,knight_tile,blob_tile,bambu_tile,fairy_tile,porcupine_tile;
int items_tile,armas_tile,tomb_tile,wkeydoor_tile,wnokeydoor_tile;
int black_tile,witch_tile,whitebear_tile,feet_tile,redjumper_tile,livingwall_tile;
int lever_tile,megabat_tile,lava_tile,piranha_tile,whitestar_tile;
int demonsign_tile,lupa_tile,demonsmoke_tile,demon_tile,spider_tile,knighthead_tile;
int chicken_tile,rockman_tile,cloud_tile,bfly_tile,armourarrow_tile;
int ghost_tile,head_tile,worm2_tile,octopus_tile,hairy_tile,waterdragon_tile;
int waterbug_tile,bird_tile,stoneman_tile,pacman_tile,reddragon_tile;
int demon_obj,demon_obj2,owl_tile,greenmonkey_tile,plant_tile,transformer_tile;
int flame_tile,witch2_tile,cyclops_tile,lcloud_tile,glizard_tile,snake_tile,bdemon_tile;
int gorilla_tile,pamperseball_tile;

/* Transportadores: */ 
int lever_room_x[MAX_LEVERS];
int lever_room_y[MAX_LEVERS];
int lever_x[MAX_LEVERS];
int lever_y[MAX_LEVERS];
int lever_drx[MAX_LEVERS][2]={{13,13},{13,13},{1,1},{1,1},{3,3},{0,0},{3,3},{3,3},{2,2},{5,5},
                                          {11,11},{11,11},{12,12},{11,11},{8,8},{6,6},{6,6},{6,6},
                                          {8,8},{8,8},{12,12}};
int lever_dry[MAX_LEVERS][2]={{13,13},{9,15},{9,15},{14,14},{15,15},{12,12},{4,4},{3,7},{2,2},
                                          {6,6},{4,4},{5,5},{5,5},{3,7},{6,6},{4,4},{3,5},{2,2},
                                          {2,2},{2,6},{2,2}};
int lever_dx[MAX_LEVERS][2]={{5*TILE_SIZE_X,23*TILE_SIZE_X},{14*TILE_SIZE_X,14*TILE_SIZE_X},
                                          {14*TILE_SIZE_X,14*TILE_SIZE_X},{5*TILE_SIZE_X,23*TILE_SIZE_X},
                                          {4*TILE_SIZE_X,19*TILE_SIZE_X},{8*TILE_SIZE_X,18*TILE_SIZE_X},
                                          {4*TILE_SIZE_X,24*TILE_SIZE_X},{14*TILE_SIZE_X,14*TILE_SIZE_X},
                                          {8*TILE_SIZE_X,20*TILE_SIZE_X},{6*TILE_SIZE_X,22*TILE_SIZE_X},
                                          {4*TILE_SIZE_X,24*TILE_SIZE_X},{6*TILE_SIZE_X,22*TILE_SIZE_X},
                                          {6*TILE_SIZE_X,20*TILE_SIZE_X},{14*TILE_SIZE_X,14*TILE_SIZE_X},
                                          {4*TILE_SIZE_X,24*TILE_SIZE_X},{7*TILE_SIZE_X,24*TILE_SIZE_X,},
                                          {14*TILE_SIZE_X,14*TILE_SIZE_X,},{4*TILE_SIZE_X,24*TILE_SIZE_X},
                                          {6*TILE_SIZE_X,24*TILE_SIZE_X},{14*TILE_SIZE_X,14*TILE_SIZE_X},
                                          {10*TILE_SIZE_X,18*TILE_SIZE_X}};
int lever_dy[MAX_LEVERS][2]={{11*TILE_SIZE_Y,11*TILE_SIZE_Y},{11*TILE_SIZE_Y,15*TILE_SIZE_Y},
                                          {11*TILE_SIZE_Y,13*TILE_SIZE_Y},{11*TILE_SIZE_Y,11*TILE_SIZE_Y},
                                          {7*TILE_SIZE_Y,7*TILE_SIZE_Y},{7*TILE_SIZE_Y,7*TILE_SIZE_Y},
                                          {7*TILE_SIZE_Y,7*TILE_SIZE_Y},{11*TILE_SIZE_Y,15*TILE_SIZE_Y},
                                          {7*TILE_SIZE_Y,7*TILE_SIZE_Y},{11*TILE_SIZE_Y,11*TILE_SIZE_Y},
                                          {11*TILE_SIZE_Y,11*TILE_SIZE_Y},{7*TILE_SIZE_Y,7*TILE_SIZE_Y},
                                          {11*TILE_SIZE_Y,11*TILE_SIZE_Y},{3*TILE_SIZE_Y,11*TILE_SIZE_Y},
                                          {7*TILE_SIZE_Y,7*TILE_SIZE_Y},{7*TILE_SIZE_Y,7*TILE_SIZE_Y,},
                                          {7*TILE_SIZE_Y,16*TILE_SIZE_Y},{7*TILE_SIZE_Y,7*TILE_SIZE_Y},
                                          {3*TILE_SIZE_Y,3*TILE_SIZE_Y},{7*TILE_SIZE_Y,15*TILE_SIZE_Y},
                                          {7*TILE_SIZE_Y,7*TILE_SIZE_Y}};

int lever_going_to[MAX_LEVERS];


int worm_state_tile[28]={1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,
                                     0,0,0,0,0,0,0,0};
int worm_state_tile_i[28]={5,5,5,5,4,4,4,4,3,3,3,3,2,2,2,2,1,1,1,1,
                                     0,0,0,0,0,0,0,0};
int worm_state_y[28]={0,0,0,0,-2,-2,-2,-2,-6,-6,-6,-6,-2,-2,-2,-2,0,0,0,0,
                                0,0,0,0,0,0,0,0};

/* Estado de las habitaciones por las que ya has pasado: */ 
#define HP_OBJS_MAX     512

int HP_room_x[HP_OBJS_MAX],HP_room_y[HP_OBJS_MAX];
int HP_obj[HP_OBJS_MAX];
int HP_obj_type[HP_OBJS_MAX];
int HP_obj_aux[HP_OBJS_MAX];


/* Efectos de sonido: */ 
SOUNDT S_pause=0,S_death=0,S_gameover=0,S_worldkey=0,S_entering=0;
SOUNDT S_gamestart=0,S_jump=0,S_sword=0,S_swordhit=0;
SOUNDT S_item=0,S_ah=0,S_ah2=0,S_powerup=0,S_enemyhit=0,S_door=0;
SOUNDT S_enemykill=0,S_ladderdisapear=0,S_armourhit=0;
SOUNDT S_enterwater=0,S_select=0,S_firearrow=0,S_firearrow2=0;
SOUNDT S_waterhit=0,S_fall=0,S_nocoins=0,S_stones=0,S_blob=0,S_shield=0;
SOUNDT S_bell=0,S_lavahit=0,S_flapwings=0,S_rotatedoor=0,S_demon2ball=0;
SOUNDT S_appearing=0,S_firebreath=0,S_F1=0,S_karrow=0;
SOUNDT S_jumptree=0,S_skeletonhit=0,S_enemybullet=0,S_headbullet=0;
SOUNDT S_dropmine=0,S_firefire=0,S_fireball=0,S_fireball2=0;
SOUNDT S_wdoor=0,S_door2=0,S_demonhit=0,S_bearbullet=0,S_chickenbomb=0;
SOUNDT S_colormonster=0,S_waterstone=0,S_demon4jump=0,S_rockman=0,S_mine=0;
SOUNDT S_bible=0,S_demon1jump=0,S_demon1bones=0,S_owl=0,S_demon7bullet=0;
SOUNDT S_demon8bullet=0,S_flamebullet=0,S_snakebullet=0,S_gorilla=0,S_lizardtongue=0;
SOUNDT S_bdemonbullet=0,S_lightning=0;

int music_volume=127;
int sfx_volume=127;


/* Control de pantalla: */ 
extern int logic_dx[4],logic_dy[4],logic_x[4],logic_y[4];
extern int physic_dx[4],physic_dy[4],physic_x[4],physic_y[4];

int zoom=640;


/* Teclas: */ 
SDLKey UP_KEY=SDLK_q,DOWN_KEY=SDLK_a,LEFT_KEY=SDLK_o,RIGHT_KEY=SDLK_p;
SDLKey SWORD_KEY=SDLK_SPACE,WEAPON_KEY=SDLK_m,ITEM_KEY=SDLK_F1,PAUSE_KEY=SDLK_F2;
SDLKey last_word[16];

char password[48]="UR3FUR3FUR4F423RUR3FUR3FUR3FUR3FUR3FUR3FURS48";
int password_pos;


void DebugReport(void)
{
      FILE *fp=fopen("report.txt","w+");

      fprintf(fp,"tiles: %i\n",n_tiles);
      fprintf(fp,"STATE: %i/%i\n",STATE,SUBSTATE);
      fprintf(fp,"GPATH: %s\n",g_paths[act_g_path]);
      fprintf(fp,"SPATH: %s\n",s_paths[act_s_path]);
      fprintf(fp,"pers_state: %i/%i\n",pers_state,pers_substate);
      fflush(fp);
      fclose(fp);

} /* DebugReport */ 


void GameCycle(BYTE *screen,int dx,int dy)
{
      char tmp[256];
      unsigned char *keyboard;

      SDL_PumpEvents();
      keyboard = SDL_GetKeyState(NULL);

      frame_counter++;

      switch(STATE) {

      /* APARECIENDO SIMBOLO DE KONAMI: */ 
      case 0:     {
                        int i;

                        if (SUBSTATE==0) {
                              init_paths();
                              if (!cargar_configuracion("MoG.cfg")) {
                                    configuracion_por_defecto();
                                    guardar_configuracion("MoG.cfg");
                              } /* if */ 
                              GameEnd();
                              GameInit(dx,dy);
                              HP_objs_reset();
//                            Mix_VolumeMusic(music_volume);
                              SetSFXVolume(sfx_volume);
                              /* Borrar la pantalla: */ 
                              memset(screen,konami_bmp->get_image()[0],dx*dy);
//                            set_palete((BYTE *)konami_bmp->get_palete());

                              for(;SUBSTATE<25;SUBSTATE++) {
                                    konami_bmp->draw_sprite(0,SUBSTATE,konami_bmp->get_ancho(),1,0,SUBSTATE*(dy/200),dx,1,screen,dx,dy,dx);
                              } /* for */ 
                        } /* if */ 

                        for(i=0;i<SUBSTATE*(dy/200);i++) {
                              konami_bmp->draw_sprite(0,i,konami_bmp->get_ancho(),1,0,i,dx,1,screen,dx,dy,dx);
                        } /* for */ 
                        SUBSTATE++;
                        if (SUBSTATE>=200) {
                              SUBSTATE=0;
                              STATE=1;
                        } /* if */ 

                        if (keyboard[SDLK_SPACE]) {
                              STATE=2;
                              SUBSTATE=0;
                        } /* if */ 
                  }
                  break;
      case 1:     SUBSTATE++;
                  konami_bmp->draw(0,0,dx,dy,screen,dx,dy,dx);
                  if (SUBSTATE>100) {
                        SUBSTATE=0;
                        STATE=2;
                  } /* if */ 
                  if (keyboard[SDLK_SPACE]) {
                        STATE=2;
                        SUBSTATE=0;
                  } /* if */ 

                  break;

      /* MENU PRINCIPAL: */ 
      case 2:     /* Borrar la pantalla: */ 
                  SUBSTATE++;
                  memset(screen,0,dx*dy);
//                      set_palete((BYTE *)tiles_bmp->get_palete());
                  menu_bmp->draw(0,0,dx,dy,screen,dx,dy,dx);
                  tile_print("PUSH SPACE KEY",TILE_SIZE_X*13,TILE_SIZE_Y*19,screen,dx,dy);

                  sprintf(tmp,"F10 CHANGES GRAPHIC SET: %s",g_path+9);
                  tmp[strlen(tmp)-1]=0;
                  strupr(tmp);
                  tile_print(tmp,TILE_SIZE_X*2,TILE_SIZE_Y*21,screen,dx,dy);
                  sprintf(tmp,"F11 CHANGES SOUND SET: %s",s_path+6);
                  strupr(tmp);
                  tmp[strlen(tmp)-1]=0;
                  tile_print(tmp,TILE_SIZE_X*2,TILE_SIZE_Y*22,screen,dx,dy);
                  tile_print("PRESS K TO REDEFINE THE KEYS",TILE_SIZE_X*6,TILE_SIZE_Y*23,screen,dx,dy);

                  if (keyboard[SDLK_SPACE]  && !old_keyboard[SDLK_SPACE]) {
                        developer_start_x=-1;
                        developer_start_y=-1;
                        developer_start_map=-1;
                        strcpy(password,"UR3FUR3FUR4F423RUR3FUR3FUR3FUR3FUR3FUR3FURS48");
                        STATE=3;
                        SUBSTATE=0;
                  } /* if */ 
                  if (keyboard[SDLK_k] && !old_keyboard[SDLK_k]) {
                        STATE=10;
                        SUBSTATE=0;
                  } /* if */ 
                  if (keyboard[SDLK_l] && !old_keyboard[SDLK_l]) {
                        int i;

                        for(i=0;i<45;i++) password[i]=' ';
                        password_pos=0;
                        STATE=14;
                        SUBSTATE=0;
                  } /* if */ 

                  if (keyboard[SDLK_g] && !old_keyboard[SDLK_g]) {
                        developer_start_x=5;
                        developer_start_y=12;
                        developer_start_map=0;
                        STATE=15;
                        SUBSTATE=0;
                  } /* if */ 

                  if (SUBSTATE>=256) {
                        STATE=17;
                        SUBSTATE=0;
                  } /* if */ 
                  break;
      case 3: /* Se ha pulsado ESPACIO: */ 
                  if (SUBSTATE==0) Sound_play(S_gamestart);
                  if ((SUBSTATE%4)==0) {
                        memset(screen,0,dx*dy);
                        menu_bmp->draw(0,0,dx,dy,screen,dx,dy,dx);
                        tile_print("  PLAY START  ",TILE_SIZE_X*13,TILE_SIZE_Y*19,screen,dx,dy);
                  } /* if */ 
                  if ((SUBSTATE%4)==2) {
                        memset(screen,0,dx*dy);
                        menu_bmp->draw(0,0,dx,dy,screen,dx,dy,dx);
                  } /* if */ 
                  if (SUBSTATE>=30) {

                        if (map==0) sprintf(tmp,"castle");
                                 else sprintf(tmp,"world");
                        Sound_create_music(tmp,0,0);
                                                
                        STATE=4;
                        SUBSTATE=0;
                        newgame();
                  } else {
                        SUBSTATE++;
                  } /* if */ 
                  break;
      case 4: /* JUEGO!!! */ 
                  if (SUBSTATE==0) {
                        SUBSTATE=1;
                        /* Primer ciclo: */ 
                        HP_filter(map_x,map_y);
                        loadroom(map,map_x,map_y);
                        HP_restore(map_x,map_y);
//                      set_palete((BYTE *)tiles_bmp->get_palete());

                        old_sword=false;
                        hit_time=0;
                        freezed=0;
                        in_ladder=-1;
                        previous_x_collision=false;
                        previous_y_collision=false;
                        pause=false;
                  } /* if */ 

                  if (next_world>=10 && world10_door_x==-1) {
                        int x[4]={1,5,9,14};
                        int y[4]={6,12,2,4};
                        int i=rand()%4;
                        world10_door_x=x[i];
                        world10_door_y=y[i];
                  } /* if */ 

                  memset(screen,0,dx*dy);
                  memset(col_buffer,0,dx*dy);   
                  drawmap(screen,dx,dy,0);

                  check_typed_word();

                  if (!pause) {
                        if (room_demonroom) {
                              if ((next_world<=1 && fighting_demon==0 && map==1 && typed_word_p("yomar")) ||
                                    (next_world<=2 && fighting_demon==0 && map==2 && typed_word_p("elohim")) ||
                                    (next_world<=3 && fighting_demon==0 && map==3 && typed_word_p("hahakla")) ||
                                    (next_world<=4 && fighting_demon==0 && map==4 && typed_word_p("barechet")) ||
                                    (next_world<=5 && fighting_demon==0 && map==5 && typed_word_p("heotymeo")) ||
                                    (next_world<=6 && fighting_demon==0 && map==6 && typed_word_p("lepha")) ||
                                    (next_world<=7 && fighting_demon==0 && map==7 && typed_word_p("nawabra")) ||
                                    (next_world<=8 && fighting_demon==0 && map==8 && typed_word_p("ascher")) ||
                                    (next_world<=9 && fighting_demon==0 && map==9 && typed_word_p("xywoleh")) ||
                                    (next_world<=10 && fighting_demon==0 && map==10 && typed_word_p("hamalech"))) {
                                    /* MONSTRUO!!!!!! */ 
                                    char str[80],str2[80];

                                    clear_typed_word();
                                    Sound_release_music();
                                    sprintf(str,"demon1");
                                  sprintf(str2,"demon2");
                                    Sound_create_music(str,str2,0);
                                    fighting_demon=1;
                              } /* if */ 
                        } else {
                              if (fighting_demon!=0) {
                                    ReleaseGraphics();
                                    ReloadGraphics(dx,dy);
                              } /* if */ 
                              fighting_demon=0;
                        } /* if */ 

                        /* Efectos de los demonios: */ 
                        if (fighting_demon!=0) {
                              if (fighting_demon<160) {
                                    demon_intro(fighting_demon,screen,dx,dy);
                                    fighting_demon++;
                              } /* if */ 
                              if (fighting_demon==160) {
                                    if (map==1) load_demon1();
                                    if (map==2) load_demon2();
                                    if (map==3) load_demon3();
                                    if (map==4) load_demon4();
                                    if (map==5) load_demon5();
                                    if (map==6) load_demon6();
                                    if (map==7) load_demon7();
                                    if (map==8) load_demon8();
                                    if (map==9) load_demon9();
                                    if (map==10) load_demon10();
                                    fighting_demon++;
                              } /* if */ 
                              if (fighting_demon==161 && bible_subcounter==0) {
                                    if (map==1) demon1_cycle();
                                    if (map==2) demon2_cycle();
                                    if (map==3) demon3_cycle();
                                    if (map==4) demon4_cycle();
                                    if (map==5) demon5_cycle();
                                    if (map==6) demon6_cycle();
                                    if (map==7) demon7_cycle();
                                    if (map==8) demon8_cycle();
                                    if (map==9) demon9_cycle();
                                    if (map==10) demon10_cycle();
                              } /* if */ 
                              if (fighting_demon>=162 && fighting_demon<194) {
                                    demon_intro(fighting_demon,screen,dx,dy);
                                    fighting_demon++;
                              } /* if */ 
                              if (fighting_demon==194) {
                                    object[demon_obj].type=T_NADA;
                                    switch(map) {
                                    case 1:
                                          world_key_item=add_object(T_ITEM,15*TILE_SIZE_X,13*TILE_SIZE_Y,0,0,37);
                                          break;
                                    case 2:
                                          object[demon_obj2].type=T_NADA;
                                          world_key_item=add_object(T_ITEM,15*TILE_SIZE_X,9*TILE_SIZE_Y,0,0,37);
                                          break;
                                    case 3:
                                          world_key_item=add_object(T_ITEM,15*TILE_SIZE_X,9*TILE_SIZE_Y,0,0,37);
                                          break;
                                    case 4:
                                          world_key_item=add_object(T_ITEM,15*TILE_SIZE_X,13*TILE_SIZE_Y,0,0,37);
                                          break;
                                    case 5:
                                          world_key_item=add_object(T_ITEM,15*TILE_SIZE_X,13*TILE_SIZE_Y,0,0,37);
                                          break;
                                    case 6:
                                          world_key_item=add_object(T_ITEM,12*TILE_SIZE_X,17*TILE_SIZE_Y,0,0,37);
                                          break;
                                    case 7:
                                          world_key_item=add_object(T_ITEM,16*TILE_SIZE_X,17*TILE_SIZE_Y,0,0,37);
                                          break;
                                    case 8:
                                          world_key_item=add_object(T_ITEM,16*TILE_SIZE_X,9*TILE_SIZE_Y,0,0,37);
                                          break;
                                    case 9:
                                          {
                                                int i;
                                                for(i=0;i<n_objects;i++) if (object[i].type==T_ENEMY) object[i].type=T_NADA;
                                                world_key_item=add_object(T_ITEM,15*TILE_SIZE_X,17*TILE_SIZE_Y,0,0,37);
                                          }
                                          break;
                                    case 10:
                                          next_world=11;
                                          fighting_demon++;
                                          break;
                                    } /* switch */ 
                                    fighting_demon++;
                              } /* if */ 
                              if (fighting_demon==195) {
                                    /* Esperando a coger la llave: */                           
                              } /* if */ 
                              if (fighting_demon>=196 && fighting_demon<356) {
                                    /* Llave cogida: */ 
                                    fighting_demon++;

                                    if (map==10 && fighting_demon>=230) {
                                          char tmp[80],tmp2[80];

                                          Sound_release_music();
                                          sprintf(tmp,"worldkey2");
                                          sprintf(tmp2,"world");
                                          Sound_create_music(tmp,tmp2,0);
                                                
                                          fighting_demon=431;
                                          next_world=11;
                                    } /* if */ 

                                    /* Hacer que el personaje salte: */ 
                                    if (map!=10) {
                                          int base_y=13;
                                          int t=(fighting_demon-196)%32;
                                          if ((((fighting_demon-196)/32)&0x01)==0) pers_right=true;
                                                                                                else pers_right=false;
                                          pers_pos=2;
                                          pers_state=0;
                                          pers_substate=0;
                                          if (map==1) base_y=13;
                                          if (map==2) base_y=9;
                                          if (map==3) base_y=9;
                                          if (map==4) base_y=13;
                                          if (map==5) base_y=13;
                                          if (map==6) base_y=17;
                                          if (map==7) base_y=17;
                                          if (map==8) base_y=9;
                                          if (map==9) base_y=17;
                                          if (t<12) {
                                                pers_y=base_y*TILE_SIZE_Y-(t*TILE_UNIT)*8;
                                          } /* if */ 
                                          if (t>=12 && t<14) {
                                                pers_y=base_y*TILE_SIZE_Y-(12*TILE_UNIT)*8-(t-12)*TILE_UNIT*4;
                                          } /* if */ 
                                          if (t>=14 && t<16) {
                                                pers_y=base_y*TILE_SIZE_Y-(12*TILE_UNIT)*8-(2*TILE_UNIT*4+(t-14)*TILE_UNIT*2);
                                          } /* if */ 
                                          if (t>=16 && t<18) {
                                                pers_y=base_y*TILE_SIZE_Y-(12*TILE_UNIT)*8-(2*TILE_UNIT*4+(18-t)*TILE_UNIT*2);
                                          } /* if */ 
                                          if (t>=18 && t<20) {
                                                pers_y=base_y*TILE_SIZE_Y-(12*TILE_UNIT)*8-(20-t)*TILE_UNIT*4;
                                          } /* if */ 
                                          if (t>=20) {
                                                pers_y=base_y*TILE_SIZE_Y-((32-t)*TILE_UNIT)*8;
                                          } /* if */ 
                                    }
                              } /* if */ 
                              if (fighting_demon>=356 && fighting_demon<432) {
                                    char tmp[80];
                                    if (next_world==11) {
                                          fighting_demon=432;
                                    } else {
                                          object[world_key_item].type=T_NADA;
                                          sprintf(tmp," I HAVE TAKEN WORLD %i BACK ! ",map);
                                          tile_print2(tmp,GAME_VIEW_X+2*TILE_SIZE_X,8*TILE_SIZE_Y,screen,dx,dy);
                                          fighting_demon++;
                                          pers_pos=0;
                                          if (fighting_demon==431 && map==3) {
                                                /* Hacer reaparecer las parededs laterales en el mundo 3: */ 
                                                int tx,ty;
                                                int x[4]={0,1,30,31};

                                                for(ty=0;ty<20;ty++) {
                                                      if ((ty%4)!=3) {
                                                            for(tx=0;tx<4;tx++) room_tiles[x[tx]+ty*room_size_x]=125;
                                                      } /* if */ 
                                                } /* for */ 
                                                room_tiles[2+19*room_size_x]=126;
                                                room_tiles[3+19*room_size_x]=126;
                                                object[0].size=9;
                                          } /* if */ 
                                    } /* if */ 
                              } /* if */ 
                        } /* if */ 

                        drawcharacter(screen,dx,dy);
                        
                        GameTestInteractions(dx,dy);
                        tile_anims(tiles_bmp,dx,dy);
                        GameObjectAnimation(dx,dy); 

                        if (fighting_demon<196 || fighting_demon>=432) GameInGameCycle(dx,dy);
                        ActualizeLevers(dx,dy);
                        GameRoomEvents();
                        RoomChange();
                  } else {
                        if (typed_word_p("zeus") && map==0 && map_x==5 && map_y==12 && pause) {
                              ZEUS_password=true;
                        } /* if */ 
                        if (pause_state<0) {
                              tiles[pause_tile[character]]->
                                    draw(GAME_VIEW_X+pers_x,GAME_VIEW_Y+pers_y-TILE_SIZE_Y,
                                           TILE_SIZE_X*2+2*TILE_UNIT,TILE_SIZE_Y*3,screen,col_buffer,dx,dy,dx);
                        } else {
                              if (pause_state<4) {
                                    tiles[pause_tile[character]+1]->
                                          draw(GAME_VIEW_X+pers_x,GAME_VIEW_Y+pers_y-TILE_SIZE_Y,
                                                 TILE_SIZE_X*2+2*TILE_UNIT,TILE_SIZE_Y*3,screen,col_buffer,dx,dy,dx);
                              } else {
                                    tiles[pause_tile[character]+2]->
                                          draw(GAME_VIEW_X+pers_x,GAME_VIEW_Y+pers_y-TILE_SIZE_Y,
                                                 TILE_SIZE_X*2+2*TILE_UNIT,TILE_SIZE_Y*3,screen,col_buffer,dx,dy,dx);
                              } /* if */ 
                        } /* if */ 
                        pause_state++;
                        if (pause_state>=8) pause_state=0;
                  } /* if */ 

                  drawstats(screen,dx,dy);

                  if (keyboard[SDLK_ESCAPE] && !old_keyboard[SDLK_ESCAPE]) {
                        OLDSTATE=STATE;
                        MENUOPTION=0;
                        STATE=19;
                  } /* if */ 

                  if (keyboard[ITEM_KEY] && !old_keyboard[ITEM_KEY] && player_energy[character]>0 && !pause && to_enter_cut==0) {
                        Sound_play(S_F1);
                        currently_selecting=0;
                        STATE=5;
                        SUBSTATE=0;
                  } /* if */ 

                  if (keyboard[PAUSE_KEY] && !old_keyboard[PAUSE_KEY]) {
                        pause=(pause ? false:true);
                        if (pause) {
                              pause_state=-256;
                              Sound_pause_music();
                              Sound_play(S_pause);
                        } else {
                              if (bible_subcounter==0) Sound_unpause_music();
                        } /* if */ 
                  } /* if */ 


                  /* Gestiona vistas: */ 
                  if (keyboard[SDLK_PAGEUP] && zoom<640) zoom+=8;
                  if (keyboard[SDLK_PAGEDOWN] && zoom>320) zoom-=8;

                  break;
      case 5:     /* PANTALLA DE ITEMS: */ 
                  memset(screen,0,dx*dy);
                  memset(col_buffer,0,dx*dy);   

                  drawstats(screen,dx,dy);
            
                  /* Popolón y aphrodite: */ 
                  if (live_character[0]) 
                        tiles[stats_tile+1]->
                              draw(GAME_VIEW_X+TILE_SIZE_X*12,GAME_VIEW_Y+TILE_SIZE_Y*1,
                                     TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                  if (live_character[1])
                        tiles[stats_tile+2]->
                              draw(GAME_VIEW_X+TILE_SIZE_X*18,GAME_VIEW_Y+TILE_SIZE_Y*1,
                                     TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                  
                  /* Cuadro que parpadea: */ 
                  if (((SUBSTATE>>2)&0x01)==0 || currently_selecting==1) {
                        if (character==0) {
                              tiles[stats_tile+3]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*12,GAME_VIEW_Y+TILE_SIZE_Y*1,
                                           TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                        } else {
                              tiles[stats_tile+3]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*18,GAME_VIEW_Y+TILE_SIZE_Y*1,
                                           TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                        } /* if */ 
                  } /* if */ 

                  /* Ítems: */ 
                  tile_print("ITEM",TILE_SIZE_X*18,GAME_VIEW_Y+TILE_SIZE_Y*5,screen,dx,dy);
                  {
                        int i,j;

                        for(i=0;i<3;i++) {
                              for(j=0;j<10;j++) {
                                    if (i==2 && j==7) {
                                          if (item[j+i*10]) {
                                                tiles[items_tile+j+i*10]->
                                                      draw(GAME_VIEW_X+TILE_SIZE_X*(6+j*2),GAME_VIEW_Y+TILE_SIZE_Y*(6+i*2),
                                                            TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                                          } else {
                                                if (item[30]) {
                                                      tiles[items_tile+30]->
                                                            draw(GAME_VIEW_X+TILE_SIZE_X*(6+j*2),GAME_VIEW_Y+TILE_SIZE_Y*(6+i*2),
                                                                  TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                                                } else {
                                                      if (item[31]) {
                                                            tiles[items_tile+31]->
                                                                  draw(GAME_VIEW_X+TILE_SIZE_X*(6+j*2),GAME_VIEW_Y+TILE_SIZE_Y*(6+i*2),
                                                                        TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                                                      } /* if */ 
                                                } /* if */ 
                                          } /* if */ 
                                    } else {
                                          if (item[j+i*10]) {
                                                tiles[items_tile+j+i*10]->
                                                      draw(GAME_VIEW_X+TILE_SIZE_X*(6+j*2),GAME_VIEW_Y+TILE_SIZE_Y*(6+i*2),
                                                            TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                                          } /* if */ 
                                    } /* if */ 
                              } /* for */ 
                        } /* for */ 
                  }

                  /* Tiles de mundo: */ 
                  if (world_key) 
                        tiles[items_tile+37]->
                              draw(GAME_VIEW_X+TILE_SIZE_X*25,GAME_VIEW_Y+TILE_SIZE_Y*13,
                                    TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                  if (cross) 
                        tiles[items_tile+36]->
                              draw(GAME_VIEW_X+TILE_SIZE_X*23,GAME_VIEW_Y+TILE_SIZE_Y*13,
                                    TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);

                  if (map>=1) {
                        int i;
                        for(i=0;i<4;i++) {
                              if (world_item[map-1][i]) {
                                    tiles[items_tile+32+i]->
                                          draw(GAME_VIEW_X+TILE_SIZE_X*(15+i*2),GAME_VIEW_Y+TILE_SIZE_Y*13,
                                                TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                              } /* if */ 
                        } /* for */ 
                  } /* if */ 

                  if (world_item[map-1][3]) {
                        /* Dibujar mapa: */ 
                        tile_print("MAP",6*TILE_SIZE_X+GAME_VIEW_X,GAME_VIEW_Y+13*TILE_SIZE_Y,screen,dx,dy);
                        draw_items_map(map,map_x,map_y,(((SUBSTATE>>2)&0x01)==0 ? true:false),screen,dx,dy);
                  } /* if */ 

                  /* Armas: */ 
                  { 
                        int i;
                        tiles[stats_tile+5]->
                              draw(GAME_VIEW_X+TILE_SIZE_X*13,GAME_VIEW_Y+TILE_SIZE_Y*15,
                                    TILE_SIZE_X*1,TILE_SIZE_Y*3,screen,col_buffer,dx,dy,dx);
                        for(i=0;i<15;i++) {
                              tiles[stats_tile+6]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*(14+i),GAME_VIEW_Y+TILE_SIZE_Y*15,
                                          TILE_SIZE_X*1,TILE_SIZE_Y*3,screen,col_buffer,dx,dy,dx);
                        } /* for */ 
                        tiles[stats_tile+7]->
                              draw(GAME_VIEW_X+TILE_SIZE_X*29,GAME_VIEW_Y+TILE_SIZE_Y*15,
                                    TILE_SIZE_X*1,TILE_SIZE_Y*3,screen,col_buffer,dx,dy,dx);

                        if (item[32]) 
                              tiles[armas_tile]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*14,GAME_VIEW_Y+TILE_SIZE_Y*16,
                                          TILE_SIZE_X*2,TILE_SIZE_Y*1,screen,col_buffer,dx,dy,dx);
                        if (item[33]) 
                              tiles[armas_tile+1]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*17,GAME_VIEW_Y+TILE_SIZE_Y*16,
                                          TILE_SIZE_X*2,TILE_SIZE_Y*1,screen,col_buffer,dx,dy,dx);
                        if (item[34]) 
                              tiles[armas_tile+2]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*20+TILE_SIZE_X/2,GAME_VIEW_Y+TILE_SIZE_Y*16,
                                          TILE_SIZE_X,TILE_SIZE_Y,screen,col_buffer,dx,dy,dx);
                        if (item[35]) 
                              tiles[armas_tile+3]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*22+TILE_SIZE_X/2,GAME_VIEW_Y+TILE_SIZE_Y*16,
                                          TILE_SIZE_X,TILE_SIZE_Y,screen,col_buffer,dx,dy,dx);
                        if (item[37]) 
                              tiles[armas_tile+5]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*24,GAME_VIEW_Y+TILE_SIZE_Y*16,
                                          TILE_SIZE_X*2,TILE_SIZE_Y*1,screen,col_buffer,dx,dy,dx);
                        if (item[36]) 
                              tiles[armas_tile+4]->
                                    draw(GAME_VIEW_X+TILE_SIZE_X*27,GAME_VIEW_Y+TILE_SIZE_Y*16,
                                          TILE_SIZE_X*2,TILE_SIZE_Y*1,screen,col_buffer,dx,dy,dx);

                        if (current_weapon!=-1) {
                              /* Cuadro que parpadea(armas): */ 
                              if (((SUBSTATE>>2)&0x01)==0 || currently_selecting==0) {
                                    int pos[6]={0,3,6,8,13,10};

                                    if (character==0) {
                                          tiles[stats_tile+4]->
                                                draw(GAME_VIEW_X+TILE_SIZE_X*(14+pos[current_weapon]),GAME_VIEW_Y+TILE_SIZE_Y*15+TILE_UNIT*4,
                                                       TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                                    } else {
                                          tiles[stats_tile+4]->
                                                draw(GAME_VIEW_X+TILE_SIZE_X*(14+pos[current_weapon]),GAME_VIEW_Y+TILE_SIZE_Y*15+TILE_UNIT*4,
                                                       TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                                    } /* if */ 
                              } /* if */ 
                        } /* if */ 
                  
                  }

                  if (!old_keyboard[LEFT_KEY] && !old_keyboard[RIGHT_KEY] &&
                        (keyboard[LEFT_KEY] || keyboard[RIGHT_KEY])) {
                        if (currently_selecting==0) {
                              if (live_character[0] &&
                                    live_character[1]) {
                                    bool forbiden=false;

                                    if (map==5 && !item[22]) forbiden=true;
                                    if (map==7 && !item[0]) forbiden=true;

                                    if (!forbiden) {
                                          if (character==0) character=1;
                                                            else  character=0;
                                          Sound_play(S_select);
                                    } /* if */ 
                              } /* if */ 
                        } else {
                              if (keyboard[RIGHT_KEY]) {
                                    Sound_play(S_select);
                                    do {
                                          switch(current_weapon) {
                                          case 0:current_weapon=1;
                                                break;
                                          case 1:current_weapon=2;
                                                break;
                                          case 2:current_weapon=3;
                                                break;
                                          case 3:current_weapon=5;
                                                break;
                                          case 4:current_weapon=0;
                                                break;
                                          case 5:current_weapon=4;
                                                break;
                                          } /* switch */ 
                                    } while(!item[32+current_weapon]);
                              } else {
                                    Sound_play(S_select);
                                    do {
                                          switch(current_weapon) {
                                          case 0:current_weapon=4;
                                                break;
                                          case 1:current_weapon=0;
                                                break;
                                          case 2:current_weapon=1;
                                                break;
                                          case 3:current_weapon=2;
                                                break;
                                          case 4:current_weapon=5;
                                                break;
                                          case 5:current_weapon=3;
                                                break;
                                          } /* switch */ 
                                    } while(!item[32+current_weapon]);
                              } /* if */ 
                        } /* if */ 
                  } /* if */ 

                  if (!old_keyboard[UP_KEY] && !old_keyboard[DOWN_KEY] &&
                        current_weapon!=-1 &&
                        (keyboard[UP_KEY] || keyboard[DOWN_KEY])) {
                        Sound_play(S_select);
                        if (currently_selecting==1) currently_selecting=0;
                                                         else currently_selecting=1;
                  } /* if */ 

                  if (current_weapon==-1) {
                        if (item[37]) current_weapon=5;
                        if (item[36]) current_weapon=4;
                        if (item[35]) current_weapon=3;
                        if (item[34]) current_weapon=2;
                        if (item[33]) current_weapon=1;
                        if (item[32]) current_weapon=0;
                  } /* if */ 

                  SUBSTATE++;

                  if (!old_keyboard[ITEM_KEY] && keyboard[ITEM_KEY]) {
                        STATE=4;
                        SUBSTATE=1;
                  } /* if */ 

                  /* Halo de ángel: */ 
                  if (item[8] && (fighting_demon==0 || fighting_demon==432) &&
                        !old_keyboard[SDLK_RETURN] && keyboard[SDLK_RETURN]) 
                  {
                        if (map!=0) {
                              STATE=9;
                              SUBSTATE=0;
                        } else {
                              STATE=4;
                              SUBSTATE=1;
                        } /* if */ 
                        if (map!=0) HP_objs_reset();
                        map=0;
                        map_x=5;
                        map_y=9;
                        pers_x=TILE_SIZE_X*16;
                        pers_y=TILE_SIZE_Y*5;
                        pers_state=0;
                        pers_pos=0;
                        n_fired_arrows=0;
                        n_fired_mines=0;
                        loadroom(map,map_x,map_y);
                  } /* if */ 

                  /* Pluma: */ 
                  if (item[26] && map==0 && !keyboard[SDLK_RETURN] &&
                        ((!old_keyboard[SDLK_1] && keyboard[SDLK_1]) ||
                         (!old_keyboard[SDLK_2] && keyboard[SDLK_2]) ||
                         (!old_keyboard[SDLK_3] && keyboard[SDLK_3]) ||
                         (!old_keyboard[SDLK_4] && keyboard[SDLK_4]) ||
                         (!old_keyboard[SDLK_5] && keyboard[SDLK_5]) ||
                         (!old_keyboard[SDLK_6] && keyboard[SDLK_6]) ||
                         (!old_keyboard[SDLK_7] && keyboard[SDLK_7]) ||
                         (!old_keyboard[SDLK_8] && keyboard[SDLK_8]) ||
                         (!old_keyboard[SDLK_9] && keyboard[SDLK_9]))) {
                        bool go=false;

                        if ((!old_keyboard[SDLK_1] && keyboard[SDLK_1]) && world_doors_open[0]) {
                              map_x=3;
                              map_y=12;
                              pers_x=TILE_SIZE_X*9;
                              pers_y=TILE_SIZE_Y*5;
                              go=true;
                        } /* if */ 
                        if ((!old_keyboard[SDLK_2] && keyboard[SDLK_2]) && world_doors_open[1]) {
                              map_x=10;
                              map_y=11;
                              pers_x=TILE_SIZE_X*25;
                              pers_y=TILE_SIZE_Y*5;
                              go=true;
                        } /* if */ 
                        if ((!old_keyboard[SDLK_3] && keyboard[SDLK_3]) && world_doors_open[2]) {
                              map_x=10;
                              map_y=8;
                              pers_x=TILE_SIZE_X*21;
                              pers_y=TILE_SIZE_Y*5;
                              go=true;
                        } /* if */ 
                        if ((!old_keyboard[SDLK_4] && keyboard[SDLK_4]) && world_doors_open[3]) {
                              map_x=0;
                              map_y=8;
                              pers_x=TILE_SIZE_X*9;
                              pers_y=TILE_SIZE_Y*9;
                              go=true;
                        } /* if */ 
                        if ((!old_keyboard[SDLK_5] && keyboard[SDLK_5]) && world_doors_open[4]) {
                              map_x=8;
                              map_y=8;
                              pers_x=TILE_SIZE_X*9;
                              pers_y=TILE_SIZE_Y*5;
                              go=true;
                        } /* if */ 
                        if ((!old_keyboard[SDLK_6] && keyboard[SDLK_6]) && world_doors_open[5]) {
                              map_x=14;
                              map_y=12;
                              pers_x=TILE_SIZE_X*21;
                              pers_y=TILE_SIZE_Y*5;
                              go=true;
                        } /* if */ 
                        if ((!old_keyboard[SDLK_7] && keyboard[SDLK_7]) && world_doors_open[6]) {
                              map_x=5;
                              map_y=2;
                              pers_x=TILE_SIZE_X*5;
                              pers_y=TILE_SIZE_Y*17;
                              go=true;
                        } /* if */ 
                        if ((!old_keyboard[SDLK_8] && keyboard[SDLK_8]) && world_doors_open[7]) {
                              map_x=4;
                              map_y=4;
                              pers_x=TILE_SIZE_X*13;
                              pers_y=TILE_SIZE_Y*17;
                              go=true;
                        } /* if */ 
                        if ((!old_keyboard[SDLK_9] && keyboard[SDLK_9]) && world_doors_open[8]) {
                              map_x=7;
                              map_y=0;
                              pers_x=TILE_SIZE_X*13;
                              pers_y=TILE_SIZE_Y*5;
                              go=true;
                        } /* if */ 
                        if (go) {
                              STATE=4;
                              SUBSTATE=1;
                              pers_state=0;
                              pers_pos=0;
                              loadroom(map,map_x,map_y);
                        } /* if */ 
                  } /* if */ 

                  if (keyboard[SDLK_ESCAPE] && !old_keyboard[SDLK_ESCAPE]) {
                        OLDSTATE=STATE;
                        MENUOPTION=0;
                        STATE=19;
                  } /* if */ 

                  break;
      case 6:     if (!old_keyboard[ITEM_KEY] && !old_keyboard[SDLK_RETURN]) {
                        STATE=4;
                        SUBSTATE=1;
                  } /* if */ 
                  break;
      case 7:     /* DENTRO DE ALGÚN PASAJE, TIENDA, ETC.: */ 
                  if (SUBSTATE==0) {
                        SUBSTATE=1;
                        currently_selecting=0;
                        passage_state=0;
                        shop_item[0]=true;
                        shop_item[1]=true;
                        shop_item[2]=true;
                  } /* if */ 


                  memset(screen,0,dx*dy);
                  memset(col_buffer,0,dx*dy);   

                  drawstats(screen,dx,dy);

                  passage_mainloop(map,map_x,map_y,screen,dx,dy);
                  
                  if (!old_keyboard[DOWN_KEY] && keyboard[DOWN_KEY]) {
                        STATE=4;
                        SUBSTATE=1;
                        /* Restaurar la música de juego normal: */ 
                        char tmp[80],tmp2[80];
                        Sound_release_music();
                        sprintf(tmp2,"entering");
                        if (map==0) sprintf(tmp,"castle");
                                 else sprintf(tmp,"world");
                        Sound_create_music(tmp2,tmp,0);

                        if (map!=0) {
                              map_y++;
                              pers_y=0;
                              pers_state=S_DOWN_LADDER;
                              pers_pos=5;
                        } /* if */ 

                  } /* if */ 

                  if (keyboard[SDLK_ESCAPE] && !old_keyboard[SDLK_ESCAPE]) {
                        OLDSTATE=STATE;
                        MENUOPTION=0;
                        STATE=19;
                  } /* if */ 
                  break;
      case 8:     if (!old_keyboard[DOWN_KEY]) {
                        STATE=4;
                        SUBSTATE=1;
                  } /* if */ 
                  break;
      case 9: /* MOSTRANDO MENSAJE DE ENTRADA A MUNDO O CASTILLO: */ 
                  world3_room06_counter=0;
                  world5_room44_state=0;
                  world5_room44_state2=0;
                  world5_room64_state=0;
                  world6_room35_state=0;
                  world7_room12_state=0;
                  world8_room12_state=0;
                  {
                        int i;
                        for(i=0;i<MAX_AW_RECORD;i++) {
                              appearwall_record_x[i]=-1;
                              appearwall_record_y[i]=-1;
                        } /* for */ 
                  }

                  if (SUBSTATE==0) {
                        HP_objs_reset();
                        Sound_release_music();
                        if (map!=0) Sound_play(S_gamestart);
                  } /* if */ 

                  memset(screen,0,dx*dy);
                  memset(screen,0,dx*dy);
                  memset(col_buffer,0,dx*dy);   

                  drawstats(screen,dx,dy);

                  {
                        char tmp[80];
                        if (map==0) sprintf(tmp,"CASTLE !");
                                 else sprintf(tmp,"WORLD %i !",map);
                        
                        tile_print(tmp,TILE_SIZE_X*16,TILE_SIZE_Y*12,screen,dx,dy);
                  }


                  if (SUBSTATE>=30) {
                        if (map==0) {
                              char tmp[80],tmp2[80];
                              
                              if (map_x==5 && map_y==9) {
                                    /* Entrada por Halo: */ 
                                    if (SUBSTATE==30) {
                                          Sound_release_music();
                                          sprintf(tmp,"castle");
                                          Sound_create_music(tmp,0,0);
                                    } /* if */ 
                              } else {
                                    if (SUBSTATE==30) {
                                          Sound_release_music();
                                          sprintf(tmp2,"entering");
                                          sprintf(tmp,"castle");
                                          Sound_create_music(tmp2,tmp,0);
                                    } /* if */ 

                                    pers_state=S_ENTERING_WORLD;
                                    pers_substate=33;
                                    to_enter_cut=32;
                              } /* if */ 
                        } else {
                              char tmp[80];
                              Sound_release_music();
                              sprintf(tmp,"world");
                              Sound_create_music(tmp,0,0);

                              pers_state=S_QUIET;
                              pers_substate=0;
                              pers_pos=0;
                              pers_right=true;
                              to_enter_cut=0;

                              if (map==1) {
                                    pers_x=16*TILE_SIZE_X;
                                    pers_y=TILE_SIZE_Y;
                              } /* if */ 
                              if (map==2) {
                                    pers_x=15*TILE_SIZE_X;
                                    pers_y=13*TILE_SIZE_Y;
                              } /* if */ 
                              if (map==3) {
                                    pers_x=15*TILE_SIZE_X;
                                    pers_y=13*TILE_SIZE_Y;
                              } /* if */ 
                              if (map==4) {
                                    world4_state=0;
                                    pers_x=3*TILE_SIZE_X;
                                    pers_y=17*TILE_SIZE_Y;
                              } /* if */ 
                              if (map==5) {
                                    pers_x=27*TILE_SIZE_X;
                                    pers_y=9*TILE_SIZE_Y;
                              } /* if */ 
                              if (map==6) {
                                    pers_x=16*TILE_SIZE_X;
                                    pers_y=TILE_SIZE_Y;
                              } /* if */ 
                              if (map==7) {
                                    pers_x=16*TILE_SIZE_X;
                                    pers_y=17*TILE_SIZE_Y;
                              } /* if */ 
                              if (map==8) {
                                    pers_x=15*TILE_SIZE_X;
                                    pers_y=1*TILE_SIZE_Y;
                              } /* if */ 
                              if (map==9) {
                                    pers_x=3*TILE_SIZE_X;
                                    pers_y=1*TILE_SIZE_Y;
                              } /* if */ 
                              if (map==10) {
                                    pers_x=2*TILE_SIZE_X;
                                    pers_y=1*TILE_SIZE_Y;
                              } /* if */ 
                        } /* if */ 
                        STATE=4;
                        SUBSTATE=0;
                  } else {
                        SUBSTATE++;
                  } /* if */ 
                  break;


      case 10:/* REDEFINIENDO TECLAS!!! */ 
                  {
                        bool found;
                        char tmp[80];
                        int i;

                        memset(screen,0,dx*dy);
                        memset(col_buffer,0,dx*dy);   

                        tmp[0]=0;

                        if (SUBSTATE>=0) {
                              tile_print("PRESS A KEY FOR UP:",TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,dx,dy);
                        } /* if */ 
                        if (SUBSTATE>=1) { 
                              sprintf(tmp,SDL_GetKeyName((SDLKey)UP_KEY));
                              tile_print(strupr(tmp),TILE_SIZE_X*26,TILE_SIZE_Y*2,screen,dx,dy);
                              tile_print("PRESS A KEY FOR DOWN:",TILE_SIZE_X*2,TILE_SIZE_Y*4,screen,dx,dy);
                        } /* if */ 
                        if (SUBSTATE>=2) { 
                              sprintf(tmp,SDL_GetKeyName((SDLKey)DOWN_KEY));
                              tile_print(strupr(tmp),TILE_SIZE_X*26,TILE_SIZE_Y*4,screen,dx,dy);
                              tile_print("PRESS A KEY FOR LEFT:",TILE_SIZE_X*2,TILE_SIZE_Y*6,screen,dx,dy);
                        } /* if */ 
                        if (SUBSTATE>=3) {  
                              sprintf(tmp,SDL_GetKeyName((SDLKey)LEFT_KEY));
                              tile_print(strupr(tmp),TILE_SIZE_X*26,TILE_SIZE_Y*6,screen,dx,dy);
                              tile_print("PRESS A KEY FOR RIGHT:",TILE_SIZE_X*2,TILE_SIZE_Y*8,screen,dx,dy);
                        } /* if */ 
                        if (SUBSTATE>=4) { 
                              sprintf(tmp,SDL_GetKeyName((SDLKey)RIGHT_KEY));
                              tile_print(strupr(tmp),TILE_SIZE_X*26,TILE_SIZE_Y*8,screen,dx,dy);
                              tile_print("PRESS A KEY FOR SWORD:",TILE_SIZE_X*2,TILE_SIZE_Y*10,screen,dx,dy);
                        } /* if */ 
                        if (SUBSTATE>=5) { 
                              sprintf(tmp,SDL_GetKeyName((SDLKey)SWORD_KEY));
                              tile_print(strupr(tmp),TILE_SIZE_X*26,TILE_SIZE_Y*10,screen,dx,dy);
                              tile_print("PRESS A KEY FOR WEAPON:",TILE_SIZE_X*2,TILE_SIZE_Y*12,screen,dx,dy);
                        } /* if */ 
                        if (SUBSTATE>=6) { 
                              sprintf(tmp,SDL_GetKeyName((SDLKey)WEAPON_KEY));
                              tile_print(strupr(tmp),TILE_SIZE_X*26,TILE_SIZE_Y*12,screen,dx,dy);
                              tile_print("PRESS A KEY FOR ITEM:",TILE_SIZE_X*2,TILE_SIZE_Y*14,screen,dx,dy);
                        } /* if */ 
                        if (SUBSTATE>=7) {
                              sprintf(tmp,SDL_GetKeyName((SDLKey)ITEM_KEY));
                              tile_print(strupr(tmp),TILE_SIZE_X*26,TILE_SIZE_Y*14,screen,dx,dy);
                              tile_print("PRESS A KEY FOR PAUSE:",TILE_SIZE_X*2,TILE_SIZE_Y*16,screen,dx,dy);
                        } /* if */ 
                        if (SUBSTATE>=8) { 
                              sprintf(tmp,SDL_GetKeyName((SDLKey)PAUSE_KEY));
                              tile_print(strupr(tmp),TILE_SIZE_X*26,TILE_SIZE_Y*16,screen,dx,dy);
                        } /* if */ 

                        tile_print("TO GO TO THE TITTLE SCREEN PRESS: ESC",TILE_SIZE_X*2,TILE_SIZE_Y*18,screen,dx,dy);
                        tile_print("TO EXIT THE GAME PRESS:           F12",TILE_SIZE_X*2,TILE_SIZE_Y*19,screen,dx,dy);
                        tile_print("TO CHANGE THE ZOOM:               PGUP:PGDN",TILE_SIZE_X*2,TILE_SIZE_Y*20,screen,dx,dy);

                        found=false;
                        for(i=0;!found && i<SDLK_LAST;i++) {
                              if (keyboard[i] && !old_keyboard[i]) {
                                    switch(SUBSTATE) {
                                    case 0:UP_KEY=(SDLKey)i;
                                             SUBSTATE++;
                                             found=true;
                                             break;
                                    case 1:DOWN_KEY=(SDLKey)i;
                                             SUBSTATE++;
                                             found=true;
                                             break;
                                    case 2:LEFT_KEY=(SDLKey)i;
                                             SUBSTATE++;
                                             found=true;
                                             break;
                                    case 3:RIGHT_KEY=(SDLKey)i;
                                             SUBSTATE++;
                                             found=true;
                                             break;
                                    case 4:SWORD_KEY=(SDLKey)i;
                                             SUBSTATE++;
                                             found=true;
                                             break;
                                    case 5:WEAPON_KEY=(SDLKey)i;
                                             SUBSTATE++;
                                             found=true;
                                             break;
                                    case 6:ITEM_KEY=(SDLKey)i;
                                             SUBSTATE++;
                                             found=true;
                                             break;
                                    case 7:PAUSE_KEY=(SDLKey)i;
                                             SUBSTATE++;
                                             found=true;
                                             break;
                                    } /* switch */ 
                              } /* if */ 
                        } /* for */ 

                        if (SUBSTATE==8 && 
                              ((keyboard[SDLK_SPACE] && !old_keyboard[SDLK_SPACE]) ||
                               (keyboard[SDLK_RETURN] && !old_keyboard[SDLK_RETURN]) ||
                               (keyboard[SDLK_ESCAPE] && !old_keyboard[SDLK_ESCAPE]) ||
                               (keyboard[SDLK_k] && !old_keyboard[SDLK_k]))) {
                              STATE=2;
                              SUBSTATE=0;
                              guardar_configuracion("MoG.cfg");
                        } /* if */ 
                  }
                  break;

      case 11:/* MENSAJE DE PERSONAJE MUERTO: */ 
                  {
                        int i,j;
                  
                        j=SUBSTATE*TILE_SIZE_X;
                        if (j>dx) j=dx;
                        if (j>0) {
                              for(i=0;i<dy;i++) {
                                    memset(screen+i*dx,0,j);
                              } /* if */ 
                        } /* if */ 
                        
                        if (SUBSTATE>=40) {
                              if (SUBSTATE==40) {
                                    if (!live_character[1] &&
                                          !live_character[0]) {
                                          ZEUS_used=false;
                                          Sound_play(S_gameover);
                                    } /* if */ 
                              } /* if */ 
                              if (!live_character[0] &&
                                     live_character[1]) {
                                    tile_print("POPOLON OUT",TILE_SIZE_X*14,TILE_SIZE_Y*12,screen,dx,dy);
                              } /* if */ 
                              if (!live_character[1] &&
                                     live_character[0]) {
                                    tile_print("APHRODITE OUT",TILE_SIZE_X*13,TILE_SIZE_Y*12,screen,dx,dy);
                              } /* if */ 
                              if (!live_character[1] &&
                                    !live_character[0]) {
                                    tile_print("GAME OVER",TILE_SIZE_X*15,TILE_SIZE_Y*12,screen,dx,dy);
                                    if (ZEUS_password && !ZEUS_used) {
                                          tile_print("F5 CONTINUE",TILE_SIZE_X*14,TILE_SIZE_Y*14,screen,dx,dy);
                                          if (keyboard[SDLK_F5] && !old_keyboard[SDLK_F5]) {
                                                ZEUS_used=true;
                                          } /* if */ 
                                    } /* if */ 
                              } /* if */ 

                        } /* if */ 

                        if (live_character[1] ||
                              live_character[0]) {
                              if (SUBSTATE>72) {
                                    j=(SUBSTATE-72)*TILE_SIZE_X;
                                    if (j>dx) j=dx;
                                    if (j>0) {
                                          for(i=0;i<dy;i++) {
                                                memset(screen+i*dx,0,j);
                                          } /* if */ 
                                    } /* if */ 
                              } /* if */ 
                        } else {
                              if (SUBSTATE>160) {
                                    j=(SUBSTATE-160)*TILE_SIZE_X;
                                    if (j>dx) j=dx;
                                    if (j>0) {
                                          for(i=0;i<dy;i++) {
                                                memset(screen+i*dx,0,j);
                                          } /* if */ 
                                    } /* if */ 
                              } /* if */ 
                        } /* if */ 

                        drawstats(screen,dx,dy);

                        if (live_character[1] ||
                              live_character[0]) {
                              if (SUBSTATE>=120) { 
                                    int tmp_x,tmp_y,heur,act_heur;
                                    int colision=T_WALL|T_LADDER_WALL|T_DOOR_WALL;

                                    /* Reinicializar la habitación: */ 
                                    HP_filter(map_x,map_y);
                                    loadroom(map,map_x,map_y);
                                    HP_restore(map_x,map_y);

                                    memset(col_buffer,0,dx*dy);   
                                    drawmap(screen,dx,dy,1);
                                    memset(screen,0,dx*dy);

                                    /* Calcular la nueva posición del personaje en el mapa: */ 
                                    character=1-character;
                                    tmp_x=8;
                                    tmp_y=4;
                                    act_heur=(15-7)*(15-7)+(10-3)*(10-3); 
                                    for(i=2;i<16;i++) {
                                          for(j=8;j<22;j++)  {
                                                if (iswall_or_blockingobject(j,i) &&
                                                      iswall_or_blockingobject(j+1,i) &&
                                                      !iswall_or_blockingobject(j,i-1) &&
                                                      !iswall_or_blockingobject(j+1,i-1) &&
                                                      !iswall_or_blockingobject(j,i-2) &&
                                                      !iswall_or_blockingobject(j+1,i-2)
                                                      &&
                                                      (tiles[character_tile[character]+MASK_OFFSET]->
                                                            coltest(GAME_VIEW_X+j*TILE_SIZE_X,GAME_VIEW_Y+(i-2)*TILE_SIZE_Y,
                                                                  TILE_SIZE_X*2,TILE_SIZE_Y*2,col_buffer,dx,dy,dx)&colision)==0
                                                      ) {
                                                      heur=(15-j)*(15-j)+(9-i)*(9-i);
                                                      if (heur<act_heur) {
                                                            tmp_x=j;
                                                            tmp_y=i;
                                                            act_heur=heur;
                                                      } /* if */ 
                                                } /* if */ 
                                          } /* for */ 
                                    } /* for */ 
                                    pers_x=tmp_x*TILE_SIZE_X;
                                    pers_y=(tmp_y-2)*TILE_SIZE_Y;
                                    pers_state=S_QUIET;
                                    pers_substate=0;
                                    pers_pos=0;
                                    n_fired_arrows=0;
                                    n_fired_mines=0;
                                    in_ladder=search_ladder(pers_x,pers_y); 

                                    if (fighting_demon!=0) {
                                          char tmp[256],tmp2[256];
      
                                          ReleaseGraphics();
                                          ReloadGraphics(dx,dy);

                                          Sound_release_music();
                                          sprintf(tmp,"demonroom1");
                                          sprintf(tmp2,"demonroom2");
                                          Sound_create_music(tmp2,tmp,0);
                                    } else {
                                          char tmp[80];
                                          Sound_release_music();
                                          if (map==0) sprintf(tmp,"castle");
                                                   else sprintf(tmp,"world");
                                          Sound_create_music(tmp,0,0);
                                    } /* if */ 
                                    old_room_demonroom=false;
                                    fighting_demon=0;
                                    STATE=4;
                                    SUBSTATE=0;
                              } else {
                                    SUBSTATE++;             
                              } /* if */ 
                        } else {
                              if (SUBSTATE>=208) {
                                    if (ZEUS_used) {
                                          map=0;
                                          map_x=5;
                                          map_y=12;

                                          n_fired_arrows=0;
                                          n_fired_mines=0;
                                          player_experience[0]=player_experience[0]=0;
                                          player_denergy[0]=player_energy[0]=player_max[0];
                                          player_denergy[1]=player_energy[1]=player_max[1];
                                          player_dexperience[0]=player_dexperience[0]=0;
                                          live_character[0]=live_character[1]=true;
                                          character=0;
                                          freezed=0;

                                          old_room_demonroom=false;
                                          pers_x=20*TILE_SIZE_X;
                                          pers_y=9*TILE_SIZE_Y;
                                          pers_right=true;
                                          pers_pos=0;
                                          pers_state=S_QUIET;
                                          pers_substate=0;
                                          current_weapon=-1;
                                          fighting_demon=0;
                                          to_enter_cut=0;
                                          mine_stepped=false;
                                          bible_counter=16;
                                          bible_subcounter=0;
                                          can_revive_character[0]=can_revive_character[1]=true;

                                          ReleaseGraphics();
                                          ReloadGraphics(dx,dy);

                                          Sound_release_music();
                                          Sound_create_music("castle",0,0);
                                          STATE=4;
                                          SUBSTATE=0;
                                    } else {
                                          STATE=0;
                                          SUBSTATE=0;
                                    } /* if */ 
                              } else {
                                    SUBSTATE++;
                              } /* if */ 
                        } /* if */ 
                  
                  }

                  if (keyboard[SDLK_ESCAPE] && !old_keyboard[SDLK_ESCAPE]) {
                        OLDSTATE=STATE;
                        MENUOPTION=0;
                        STATE=19;
                  } /* if */ 
                  break;

            case 12: /* MIRANDO UNA TUMBA: */ 
                  if (SUBSTATE==0) {
                        char tmp[80],tmp2[80];
                        Sound_release_music();
                        /* Musica de cuando miras con la lupa: */ 
                        sprintf(tmp,"tomb1");
                        sprintf(tmp2,"tomb2");
                        Sound_create_music(tmp,tmp2,0);
                        SUBSTATE=1;
                  } /* if */ 

                  memset(screen,0,dx*dy);
                  memset(col_buffer,0,dx*dy);   

                  drawstats(screen,dx,dy);

                  /* Dibujar lupa: */ 
                  tiles[lupa_tile]->
                        draw(GAME_VIEW_X+TILE_SIZE_X*4,GAME_VIEW_Y+TILE_SIZE_Y*2,
                               TILE_SIZE_X*24,TILE_SIZE_Y*12,screen,col_buffer,dx,dy,dx);

                  if (map==1 && map_x==2 && map_y==7) 
                        tile_print2("YOMAR",GAME_VIEW_X+TILE_SIZE_X*13+TILE_SIZE_X/2,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==2 && map_x==4 && map_y==1) 
                        tile_print2("ELOHIM",GAME_VIEW_X+TILE_SIZE_X*13,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==3 && map_x==2 && map_y==4) 
                        tile_print2("HAHAKLA",GAME_VIEW_X+TILE_SIZE_X*13-TILE_SIZE_X/2,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==4 && map_x==4 && map_y==0) 
                        tile_print2("BARECHET",GAME_VIEW_X+TILE_SIZE_X*12,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==5 && map_x==1 && map_y==2) 
                        tile_print2("HEOTYMEO",GAME_VIEW_X+TILE_SIZE_X*12,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==6 && map_x==1 && map_y==3) 
                        tile_print2("LEPHA",GAME_VIEW_X+TILE_SIZE_X*13+TILE_SIZE_X/2,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==7 && map_x==4 && map_y==4) 
                        tile_print2("NAWABRA",GAME_VIEW_X+TILE_SIZE_X*12+TILE_SIZE_X/2,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==8 && map_x==3 && map_y==3) 
                        tile_print2("ASCHER",GAME_VIEW_X+TILE_SIZE_X*13,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==9 && map_x==1 && map_y==0) 
                        tile_print2("XYWOLEH",GAME_VIEW_X+TILE_SIZE_X*12+TILE_SIZE_X/2,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);
                  if (map==10) 
                        tile_print2("HAMALECH",GAME_VIEW_X+TILE_SIZE_X*12,GAME_VIEW_Y+TILE_SIZE_Y*6+TILE_SIZE_Y/2,screen,dx,dy);

                  if ((!old_keyboard[WEAPON_KEY] && keyboard[WEAPON_KEY]) ||
                        (!old_keyboard[SWORD_KEY] && keyboard[SWORD_KEY])) {
                        STATE=13;
                        SUBSTATE=0;
                  } /* if */ 

                  if (keyboard[SDLK_ESCAPE] && !old_keyboard[SDLK_ESCAPE]) {
                        OLDSTATE=STATE;
                        MENUOPTION=0;
                        STATE=19;
                  } /* if */ 
                  break;
            case 13:
                  if (!keyboard[WEAPON_KEY]) {
                        STATE=4;
                        SUBSTATE=1;
                        {
                              char tmp[80];
                              Sound_release_music();
                              if (map==0) sprintf(tmp,"castle");
                                       else sprintf(tmp,"world");
                              Sound_create_music(tmp,0,0);
                        }
                  } /* if */ 

                  break;

            case 14:
                  {
                        int i,j;
                        bool found;
                        char buf[20]="0000 0000 0000 0000";
                        int ypos[3]={8,10,12};
                        int xpos[16]={10,11,12,13,15,16,17,18,20,21,22,23,25,26,27,28};
                        int x,y;

                        /* Entrando código!!!!: */ 
                        memset(screen,0,dx*dy);
                        tile_print("h F5 TO F9",TILE_SIZE_X*9,TILE_SIZE_Y*2,screen,dx,dy);

                        tile_print("ENTER THE SECRET",TILE_SIZE_X*9,TILE_SIZE_Y*4,screen,dx,dy);
                        tile_print("CODE AND PRESS",TILE_SIZE_X*9,TILE_SIZE_Y*5,screen,dx,dy);
                        tile_print("RETURN KEY.",TILE_SIZE_X*9,TILE_SIZE_Y*6,screen,dx,dy);

                        buf[0]=password[0]; buf[1]=password[1]; buf[2]=password[2]; buf[3]=password[3];
                        buf[5]=password[4]; buf[6]=password[5]; buf[7]=password[6]; buf[8]=password[7];
                        buf[10]=password[8]; buf[11]=password[9]; buf[12]=password[10]; buf[13]=password[11];
                        buf[15]=password[12]; buf[16]=password[13]; buf[17]=password[14]; buf[18]=password[15];
                        tile_print(buf,TILE_SIZE_X*10,TILE_SIZE_Y*8,screen,dx,dy);

                        buf[0]=password[16]; buf[1]=password[17]; buf[2]=password[18]; buf[3]=password[19];
                        buf[5]=password[20]; buf[6]=password[21]; buf[7]=password[22]; buf[8]=password[23];
                        buf[10]=password[24]; buf[11]=password[25]; buf[12]=password[26]; buf[13]=password[27];
                        buf[15]=password[28]; buf[16]=password[29]; buf[17]=password[30]; buf[18]=password[31];
                        tile_print(buf,TILE_SIZE_X*10,TILE_SIZE_Y*10,screen,dx,dy);

                        buf[0]=password[32]; buf[1]=password[33]; buf[2]=password[34]; buf[3]=password[35];
                        buf[5]=password[36]; buf[6]=password[37]; buf[7]=password[38]; buf[8]=password[39];
                        buf[10]=password[40]; buf[11]=password[41]; buf[12]=password[42]; buf[13]=password[43];
                        buf[15]=password[44]; buf[16]=' '; buf[17]=' '; buf[18]=' ';
                        tile_print(buf,TILE_SIZE_X*10,TILE_SIZE_Y*12,screen,dx,dy);

                        /* Pintar cursor: */ 
                        x=xpos[password_pos%16];
                        y=ypos[password_pos/16];
                        B_rectangle2(screen,x*TILE_SIZE_X-1,y*TILE_SIZE_Y-1,TILE_SIZE_X,TILE_SIZE_Y,dx,180);

                        if (SUBSTATE==0) {
                              found=false;
                              int slot=-1;
                              /* Recuperar el juego a disco: */ 

                              if (!old_keyboard[SDLK_F5] && keyboard[SDLK_F5]) slot=1;
                              if (!old_keyboard[SDLK_F6] && keyboard[SDLK_F6]) slot=2;
                              if (!old_keyboard[SDLK_F7] && keyboard[SDLK_F7]) slot=3;
                              if (!old_keyboard[SDLK_F8] && keyboard[SDLK_F8]) slot=4;
                              if (!old_keyboard[SDLK_F9] && keyboard[SDLK_F9]) slot=5;

                              if (slot!=-1) {
                                    char tmp[80];
                                    FILE *fp;

                                    sprintf(tmp,"sgame%.2i.txt",slot);
                                    fp=fopen(tmp,"r");
                                    if (fp!=0) {
                                          int i;
                                          for(i=0;i<48;i++) {
                                                password[i]=fgetc(fp);
                                          } /* for */ 
                                          fclose(fp);
                                          Sound_play(S_select);
                                    } else {
                                          Sound_play(S_nocoins);
                                    } /* if */ 
                              } /* if */ 

                              if (!old_keyboard[SDLK_ESCAPE] && keyboard[SDLK_ESCAPE]) {
                                    STATE=0;
                                    SUBSTATE=0;
                              } /* if */ 

                              if (!old_keyboard[SDLK_RETURN] && keyboard[SDLK_RETURN]) {
                                    if (readpassword(password)) SUBSTATE=2;
                                                                     else SUBSTATE=1;
                              } /* if */ 
                              if (!old_keyboard[SDLK_LEFT] && keyboard[SDLK_LEFT] && password_pos>0) password_pos--;
                              if (!old_keyboard[SDLK_RIGHT] && keyboard[SDLK_RIGHT] && password_pos<44) password_pos++;
                              if (!old_keyboard[SDLK_0] && keyboard[SDLK_0]) {
                                    password[password_pos]='0';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_1] && keyboard[SDLK_1]) {
                                    password[password_pos]='1';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_2] && keyboard[SDLK_2]) {
                                    password[password_pos]='2';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_3] && keyboard[SDLK_3]) {
                                    password[password_pos]='3';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_4] && keyboard[SDLK_4]) {
                                    password[password_pos]='4';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_5] && keyboard[SDLK_5]) {
                                    password[password_pos]='5';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_6] && keyboard[SDLK_6]) {
                                    password[password_pos]='6';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_7] && keyboard[SDLK_7]) {
                                    password[password_pos]='7';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_8] && keyboard[SDLK_8]) {
                                    password[password_pos]='8';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_9] && keyboard[SDLK_9]) {
                                    password[password_pos]='9';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_a] && keyboard[SDLK_a]) {
                                    password[password_pos]='A';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_b] && keyboard[SDLK_b]) {
                                    password[password_pos]='B';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_c] && keyboard[SDLK_c]) {
                                    password[password_pos]='C';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_d] && keyboard[SDLK_d]) {
                                    password[password_pos]='D';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_e] && keyboard[SDLK_e]) {
                                    password[password_pos]='E';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_f] && keyboard[SDLK_f]) {
                                    password[password_pos]='F';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_g] && keyboard[SDLK_g]) {
                                    password[password_pos]='G';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_h] && keyboard[SDLK_h]) {
                                    password[password_pos]='H';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_i] && keyboard[SDLK_i]) {
                                    password[password_pos]='I';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_j] && keyboard[SDLK_j]) {
                                    password[password_pos]='J';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_k] && keyboard[SDLK_k]) {
                                    password[password_pos]='K';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_l] && keyboard[SDLK_l]) {
                                    password[password_pos]='L';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_m] && keyboard[SDLK_m]) {
                                    password[password_pos]='M';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_n] && keyboard[SDLK_n]) {
                                    password[password_pos]='N';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_o] && keyboard[SDLK_o]) {
                                    password[password_pos]='O';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_p] && keyboard[SDLK_p]) {
                                    password[password_pos]='P';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_q] && keyboard[SDLK_q]) {
                                    password[password_pos]='Q';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_r] && keyboard[SDLK_r]) {
                                    password[password_pos]='R';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_s] && keyboard[SDLK_s]) {
                                    password[password_pos]='S';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_t] && keyboard[SDLK_t]) {
                                    password[password_pos]='T';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_u] && keyboard[SDLK_u]) {
                                    password[password_pos]='U';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_v] && keyboard[SDLK_v]) {
                                    password[password_pos]='V';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_w] && keyboard[SDLK_w]) {
                                    password[password_pos]='W';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_x] && keyboard[SDLK_x]) {
                                    password[password_pos]='X';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_y] && keyboard[SDLK_y]) {
                                    password[password_pos]='Y';
                                    password_pos++;
                              } /* if */ 
                              if (!old_keyboard[SDLK_z] && keyboard[SDLK_z]) {
                                    password[password_pos]='Z';
                                    password_pos++;
                              } /* if */ 

                              if (password_pos>44) password_pos=44;
                        } /* if */ 

                        if (SUBSTATE==1) {
                              tile_print("THAT IS THE WRONG",TILE_SIZE_X*9,TILE_SIZE_Y*17,screen,dx,dy);
                              tile_print("CODE",TILE_SIZE_X*9,TILE_SIZE_Y*19,screen,dx,dy);
                              if (!old_keyboard[SDLK_RETURN] && keyboard[SDLK_RETURN]) SUBSTATE=0;
                        } /* if */ 
                        if (SUBSTATE>=2) {
                              tile_print("MY MEMORY HAS BEEN",TILE_SIZE_X*9,TILE_SIZE_Y*17,screen,dx,dy);
                              tile_print("BROUGHT BACK!",TILE_SIZE_X*9,TILE_SIZE_Y*18,screen,dx,dy);
                              tile_print("DEFEAT GALIOUS AND",TILE_SIZE_X*9,TILE_SIZE_Y*19,screen,dx,dy);
                              tile_print("SAVE PAMPERSE AS",TILE_SIZE_X*9,TILE_SIZE_Y*20,screen,dx,dy);
                              tile_print("SOON AS POSSIBLE! GO!",TILE_SIZE_X*9,TILE_SIZE_Y*21,screen,dx,dy);
                              SUBSTATE++;

                              if (SUBSTATE>66) {
                                    j=(SUBSTATE-66)*TILE_SIZE_X;
                                    if (j>dx) j=dx;
                                    if (j>0) {
                                          for(i=0;i<dy;i++) {
                                                memset(screen+i*dx,0,j);
                                          } /* if */ 
                                    } /* if */ 
                              } /* if */ 

                              if (SUBSTATE>=112) {
                                    if (map==0) sprintf(tmp,"castle");
                                             else sprintf(tmp,"world");
                                    Sound_create_music(tmp,0,0);
                                    STATE=4;
                                    SUBSTATE=0;
                                    newgame();
                              } /* if */ 
                        } /* if */ 
                  }

                  break;

            case 15:
                  {
                        char tmp[80],filename[80];
                        FILE *fp;
                        char *prefixes[11]={"map","w01","w02","w03","w04","w05","w06","w07","w08","w09","w10"};

                        /* Developers entry code: */ 
                        memset(screen,0,dx*dy);

                        tile_print("START ROOM:",TILE_SIZE_X*9,TILE_SIZE_Y*2,screen,dx,dy);
      
                        sprintf(tmp,"ROOM X: %.2i",developer_start_x);              
                        tile_print(tmp,TILE_SIZE_X*9,TILE_SIZE_Y*4,screen,dx,dy);
                        sprintf(tmp,"ROOM Y: %.2i",developer_start_y);              
                        tile_print(tmp,TILE_SIZE_X*9,TILE_SIZE_Y*5,screen,dx,dy);
                        sprintf(tmp,"MAP: %.2i",developer_start_map);               
                        tile_print(tmp,TILE_SIZE_X*9,TILE_SIZE_Y*6,screen,dx,dy);

                        if (keyboard[UP_KEY] && !old_keyboard[UP_KEY]) {
                              if (developer_start_y>0) developer_start_y--;
                        } /* if */ 
                        if (keyboard[DOWN_KEY] && !old_keyboard[DOWN_KEY]) {
                              if (developer_start_y<15) developer_start_y++;
                        } /* if */ 
                        if (keyboard[LEFT_KEY] && !old_keyboard[LEFT_KEY]) {
                              if (developer_start_x>0) developer_start_x--;
                        } /* if */ 
                        if (keyboard[RIGHT_KEY] && !old_keyboard[RIGHT_KEY]) {
                              if (developer_start_x<14) developer_start_x++;
                        } /* if */ 
                        if (keyboard[SDLK_PAGEDOWN] && !old_keyboard[SDLK_PAGEDOWN]) {
                              if (developer_start_map>0) developer_start_map--;
                        } /* if */ 
                        if (keyboard[SDLK_PAGEUP] && !old_keyboard[SDLK_PAGEUP]) {
                              if (developer_start_map<10) developer_start_map++;
                        } /* if */ 

                        sprintf(filename,"rooms/%s%.2i%.2i.txt",prefixes[developer_start_map],
                                                                                    developer_start_x,
                                                                                    developer_start_y);
                        fp=fopen(filename,"r");
                        if (fp!=0) {
                              tile_print("PRESS SPACE TO START",TILE_SIZE_X*9,TILE_SIZE_Y*8,screen,dx,dy);
                              if (keyboard[SDLK_SPACE] && !old_keyboard[SDLK_SPACE]) {
                                    strcpy(password,"UR3QUR5FUG4F123NUL7WHUD4VT7WHUD4VYTFUR3FURS76");
                                    STATE=3;
                                    SUBSTATE=30;
                              } /* if */ 
                              fclose(fp);
                        } else {
                              tile_print("NOT VALID ROOM",TILE_SIZE_X*9,TILE_SIZE_Y*8,screen,dx,dy);
                        } /* if */ 
                  }
                  break;
            case 16:
                  /* INTER-PANTALLA */ 
                  if (inter_screen==0) {
                        STATE=4;
                  } else {
                        memset(screen,0,dx*dy);
                        inter_screen--;
                  } /* if */ 
                  break;

            case 17:
                  {
                        /* PANTALLA DE HISTORIA: */ 
                        int i;
                        int y=0,tmpy;
                        char *text[12]={
                              "           STORY",
                              "POPOLON WENT INTO MT.ATOS TO",
                              "RESCUE APHRODITE KIDNAPPED",
                              "BY HUDNOS. BUT IT WAS A TRAP",
                              "MADE BY GALIOUS. HE ATTACKED",
                              "THE CASTLE DURING POPOLON'S",
                              "ABSENCE AND ALSO KIDNAPPED",
                              "AND IMPRISONED A BABY FROM",
                              "THE HEAVEN WHO WAS SUPPOSED",
                              "TO BE BORN TO POPOLON AND",
                              "APHRODITE SEVERAL YEARS",
                              "LATER..."};

                        if (SUBSTATE==0) {
                              /* musica: */ 
                              Sound_create_music("story",0,0);
                        } /* if */ 

                        SUBSTATE++;

                        if (SUBSTATE<27*TILE_SIZE_Y) y=27*TILE_SIZE_Y-SUBSTATE;
                        if (SUBSTATE>=27*TILE_SIZE_Y && SUBSTATE<39*TILE_SIZE_Y) y=0;
                        if (SUBSTATE>=39*TILE_SIZE_Y) y=39*TILE_SIZE_Y-SUBSTATE;

                        memset(screen,0,dx*dy);
                        for(i=0;i<12;i++) {
                              tmpy=y+i*TILE_SIZE_Y*2;
                              if (tmpy<25*TILE_SIZE_Y && tmpy>(-TILE_SIZE_Y)) {
                                    tile_print(text[i],GAME_VIEW_X+TILE_SIZE_X*2,tmpy,screen,dx,dy);
                              } /* if */ 
                        } /* for */ 

                        if (SUBSTATE>=64*TILE_SIZE_Y ||
                              (keyboard[SDLK_SPACE]  && !old_keyboard[SDLK_SPACE])) {
                              /* musica: */ 
                              Sound_release_music();
                              STATE=0;
                              SUBSTATE=0;
                        } /* if */ 
                  }
                  break;
            
            case 18:
                  /* SECUENCIA DEL FINAL!!!!: */ 
                  SUBSTATE++;
                  if (SUBSTATE<40) {
                        int i,j;
                  
                        j=(SUBSTATE/4)*TILE_SIZE_X;
                        for(i=0;i<room_size_y*TILE_SIZE_Y;i++) {
                              memset(screen+(GAME_VIEW_Y+i)*dx+GAME_VIEW_X,0,j);
                              memset(screen+(GAME_VIEW_Y+i)*dx+GAME_VIEW_X+(room_size_x*TILE_SIZE_X-j),0,j);
                        } /* if */ 
                        for(i=0;i<TILE_SIZE_Y;i++) {
                              memset(screen+(GAME_VIEW_Y+(SUBSTATE/4)*TILE_SIZE_Y+i)*dx+GAME_VIEW_X,0,room_size_x*TILE_SIZE_X);
                              memset(screen+(GAME_VIEW_Y+(room_size_y-((SUBSTATE/4)+1))*TILE_SIZE_Y+i)*dx+GAME_VIEW_X,0,room_size_x*TILE_SIZE_X);
                        } /* if */ 
                        for(i=0;i<n_objects;i++) {
                              if (object[i].type==T_PAMPERSE) {
                                    tiles[182]->
                                          draw(GAME_VIEW_X+object[i].x,GAME_VIEW_Y+object[i].y,
                                                 TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);         
                              } /* if */ 
                        } /* for */ 
                        drawcharacter(screen,dx,dy);
                  } /* if */ 

                  if (SUBSTATE==96) {
                        int i;

                        Sound_release_music();
                        memset(screen,0,dx*dy);

                        for(i=0;i<8;i++) {
                              if (tiles[demon_tile+i]!=0) delete tiles[demon_tile+i];
                        } /* for */ 
                        tiles[demon_tile]=new CTile(final_bmp,0,0,TILE_SIZE_X*20,TILE_SIZE_Y*14,T_NADA);

                        tiles[demon_tile+1]=new CTile(final_bmp,TILE_SIZE_X*20,0,TILE_SIZE_X*6,TILE_SIZE_Y*2,T_NADA);
                        tiles[demon_tile+2]=new CTile(final_bmp,TILE_SIZE_X*20,TILE_SIZE_Y*2,TILE_SIZE_X*6,TILE_SIZE_Y*2,T_NADA);
                        tiles[demon_tile+3]=new CTile(final_bmp,TILE_SIZE_X*20,TILE_SIZE_Y*4,TILE_SIZE_X*6,TILE_SIZE_Y*2,T_NADA);
                        tiles[demon_tile+4]=new CTile(final_bmp,TILE_SIZE_X*26,TILE_SIZE_Y*2,TILE_SIZE_X*2,TILE_SIZE_Y*2,T_NADA);
                        tiles[demon_tile+5]=new CTile(final_bmp,TILE_SIZE_X*26,0,TILE_SIZE_X*2,TILE_SIZE_Y*2,T_NADA);
                        tiles[demon_tile+6]=new CTile(final_bmp,TILE_SIZE_X*28,0,TILE_SIZE_X*2,TILE_SIZE_Y*2,T_NADA);
                        tiles[demon_tile+7]=new CTile(final_bmp,TILE_SIZE_X*30,0,TILE_SIZE_X*8,TILE_SIZE_Y*4,T_NADA);
                  } /* if */ 

                  if (SUBSTATE==128) {
                        char str[256];

                        Sound_release_music();
                        sprintf(str,"end1");
                        Sound_create_music(str,0,0);
                  } /* if */ 
                  if (SUBSTATE>=128 && SUBSTATE<464) {
                        memset(screen,0,dx*dy);
                        /* POPOLON Y APHRODITE: */ 
                        tiles[demon_tile+1+((SUBSTATE>>4)%2)]->
                              draw(GAME_VIEW_X+13*TILE_SIZE_X+TILE_SIZE_X/2,GAME_VIEW_Y+8*TILE_SIZE_Y,
                                          screen,col_buffer,dx,dy,dx);

                        /* PAMPERSE: */ 
                        {
                              int y=10*TILE_SIZE_Y-(SUBSTATE-256);
                              if (y>=10*TILE_SIZE_Y) y=10*TILE_SIZE_Y;
                              if (y<=8*TILE_SIZE_Y) y=8*TILE_SIZE_Y;
                              tiles[demon_tile+3]->
                                    draw(GAME_VIEW_X+13*TILE_SIZE_X+TILE_SIZE_X/2,GAME_VIEW_Y+y,
                                                screen,col_buffer,dx,dy,dx);
                        }

                        /* CASTILLO: */ 
                        tiles[demon_tile]->
                              draw(GAME_VIEW_X+6*TILE_SIZE_X,GAME_VIEW_Y,
                                          screen,col_buffer,dx,dy,dx);
                        /* PETARDOS: */ 
                        {
                              int i;
                              i=(SUBSTATE>>4)%4;

                              if (i==0) {
                                    tiles[demon_tile+6]->
                                          draw(GAME_VIEW_X+18*TILE_SIZE_X+TILE_SIZE_X/2,GAME_VIEW_Y+1*TILE_SIZE_Y+TILE_SIZE_Y/2,
                                                      screen,col_buffer,dx,dy,dx);
                              } /* if */ 
                              if (i==2) {
                                    tiles[demon_tile+6]->
                                          draw(GAME_VIEW_X+12*TILE_SIZE_X,GAME_VIEW_Y+1*TILE_SIZE_Y+TILE_SIZE_Y/2,
                                                      screen,col_buffer,dx,dy,dx);
                              } /* if */ 
                        }

                        /* BANDERA: */ 
                        if (SUBSTATE<196) {
                              tiles[demon_tile+4]->
                                    draw(GAME_VIEW_X+16*TILE_SIZE_X,GAME_VIEW_Y+2*TILE_SIZE_Y+TILE_UNIT*2,
                                                screen,col_buffer,dx,dy,dx);
                        } /* if */ 
                        if (SUBSTATE>=192 && SUBSTATE<224) {
                              tiles[demon_tile+4]->
                                    draw(GAME_VIEW_X+16*TILE_SIZE_X,GAME_VIEW_Y+2*TILE_SIZE_Y+(SUBSTATE-192)+TILE_UNIT*2,
                                                screen,col_buffer,dx,dy,dx);
                        } /* if */ 
                        if (SUBSTATE>=224 && SUBSTATE<256) {
                              tiles[demon_tile+5]->
                                    draw(GAME_VIEW_X+16*TILE_SIZE_X,GAME_VIEW_Y+2*TILE_SIZE_Y+(32-(SUBSTATE-224))+TILE_UNIT*2,
                                                screen,col_buffer,dx,dy,dx);
                        } /* if */ 
                        if (SUBSTATE>=256) {
                              tiles[demon_tile+5]->
                                    draw(GAME_VIEW_X+16*TILE_SIZE_X,GAME_VIEW_Y+2*TILE_SIZE_Y+TILE_UNIT*2,
                                                screen,col_buffer,dx,dy,dx);
                        } /* if */ 

                        /* GRITOS: */ 
                        if (SUBSTATE>=320) {
                              tiles[demon_tile+7]->
                                    draw(GAME_VIEW_X+20*TILE_SIZE_X,GAME_VIEW_Y+9*TILE_SIZE_Y,
                                                screen,col_buffer,dx,dy,dx);
                        } /* if */ 
                  } /* if */ 

                  if (SUBSTATE==464) {
                        memset(screen,0,dx*dy);
                        Sound_release_music();
                  } /* if */ 

                  if (SUBSTATE==512) {
                        char str[256];

                        sprintf(str,"end2");
                        Sound_create_music(str,0,0);
                  } /* if */ 

                  if (SUBSTATE>=512) {
                        int i;
                        int y=0,tmpy;
                        char *text[68]={
                              "          EPILOGUE",
                              "THANKS TO YOU,THE BABY WAS",
                              "RESCUED SAFELY.THE KINGDOM",
                              "TOOK BACK PACE AND VIGOR.",
                              "POPOLON WAS AWARDED THE",
                              "CROWN FOR HIS ACHIEVEMENT.IT",
                              "WAS DECIDED THAT HE PROTECT",
                              "THE KINGDOM WITH APHRODITE",
                              "AS HIS WIFE FOR THE REST OF",
                              "THEIR LIVES.THIS LEGEND WILL",
                              "BE TOLD AGAIN WHEN THEY ARE",
                              "APT TO LOSE BELIEF IN LOVE.",
                              "",
                              "",
                              "",
                              "",
                              "",
                              "",
                              "",
                              "",
                              "       ORIGINAL  STAFF",
                              "",
                              "       MAIN PROGRAMMER",
                              "          Y.HARUKI",
                              "",
                              "       SUB  PROGRAMMER",
                              "           I.AKADA",
                              "           M.OZAWA",
                              "            T.OKA",
                              "         Y.HIRONAKA",
                              "           K.OZAWA",
                              "         S.YOSHINAWA",
                              "",
                              "      GRAPHIC DESIGNER",
                              "          R.SHOGAKI",
                              "         C.TANIGAKI",
                              "          T.MIYOSHI",
                              "         K.SHIRAKAGI",
                              "",
                              "       SOUND  CREATOR",
                              "          K.UEHARA",
                              "",
                              "",
                              "    PLANNER AND DIRECTOR",
                              "          R.SHOGAKI",
                              "",
                              "",
                              "",
                              "",
                              "   WE PROMISE TO CONTINUE",
                              "   SENDING ROMANTIC GAME",
                              "   MESSAGES.",
                              "",
                              "   THANK YOU VERY MUCH",
                              "   FOR YOUR JOINING IN",
                              "   THIS STORY.",
                              "",
                              "",
                              "",
                              "",
                              "",
                              "",
                              "",
                              "    PRESENTED ",
                              "    ORIGINALLY AT  1987",
                              "",
                              "    REMAKE PRESENTED BY ",
                              "   SANTI ONTAÑON AT 2002"};


                        if (SUBSTATE<(512+27*TILE_SIZE_Y)) y=27*TILE_SIZE_Y-(SUBSTATE-512);
                        if (SUBSTATE>=(512+27*TILE_SIZE_Y) && SUBSTATE<(512+39*TILE_SIZE_Y)) y=0;
                        if (SUBSTATE>=(512+39*TILE_SIZE_Y) && SUBSTATE<(512+157*TILE_SIZE_Y)) y=39*TILE_SIZE_Y-(SUBSTATE-512);
                        if (SUBSTATE>=(512+157*TILE_SIZE_Y) && SUBSTATE<(512+169*TILE_SIZE_Y)) y=-118*TILE_SIZE_Y;
                        if (SUBSTATE>=(512+169*TILE_SIZE_Y)) y=51*TILE_SIZE_Y-(SUBSTATE-512);

                        memset(screen,0,dx*dy);
                        for(i=0;i<68;i++) {
                              tmpy=y+i*TILE_SIZE_Y*2;
                              if (tmpy<25*TILE_SIZE_Y && tmpy>(-TILE_SIZE_Y)) {
                                    tile_print(text[i],GAME_VIEW_X+TILE_SIZE_X*2,tmpy,screen,dx,dy);
                              } /* if */ 
                        } /* for */ 
                  } /* if */ 

                  if (SUBSTATE>=3500) {
                        Sound_release_music();
                        STATE=0;
                        SUBSTATE=0;
                  } /* if */ 
                  break;

            case 19:
                  /* MENU DE OPCIONES: */ 
                  {
                        char tmp[80];
                        char *letter[15]={"A","B","C","D","E", "F","G","H","I","J", "K","L","M","N","O"};

                        memset(screen,0,dx*dy);

                        B_rectangle(screen,TILE_SIZE_X*10,TILE_SIZE_Y*5+MENUOPTION*TILE_SIZE_Y*2,
                                                   TILE_SIZE_X*19,TILE_SIZE_Y,dx,47);

                        tile_print("OPTIONS MENU",TILE_SIZE_X*14,TILE_SIZE_Y*2,screen,dx,dy);
                        tile_print("QUIT GAME",TILE_SIZE_X*15,TILE_SIZE_Y*5,screen,dx,dy);
                        sprintf(tmp,"MUSIC VOLUME: %.3i",(100*music_volume)/127);
                        tile_print(tmp,TILE_SIZE_X*11,TILE_SIZE_Y*7,screen,dx,dy);
                        sprintf(tmp,"SFX VOLUME: %.3i",(100*sfx_volume)/127);
                        tile_print(tmp,TILE_SIZE_X*12,TILE_SIZE_Y*9,screen,dx,dy);

                        if (map==0) sprintf(tmp,"CASTLE    %s%i",letter[map_x],map_y+1);
                                 else sprintf(tmp,"WORLD %.2i  %s%i",map,letter[map_x],map_y+1);
                        tile_print(tmp,TILE_SIZE_X*13,TILE_SIZE_Y*12,screen,dx,dy);

                        if (keyboard[SDLK_ESCAPE] && !old_keyboard[SDLK_ESCAPE]) {
                              STATE=OLDSTATE;
                              guardar_configuracion("MoG.cfg");
                        } /* if */ 
                        if (keyboard[DOWN_KEY] && !old_keyboard[DOWN_KEY] && MENUOPTION<2) MENUOPTION++;
                        if (keyboard[UP_KEY] && !old_keyboard[UP_KEY] && MENUOPTION>0) MENUOPTION--;

                        if (keyboard[SWORD_KEY] && !old_keyboard[SWORD_KEY] && MENUOPTION==0) {
                              Sound_release_music();
                              STATE=0;
                              SUBSTATE=0;
                              guardar_configuracion("MoG.cfg");
                        } /* if */ 

                        if (keyboard[RIGHT_KEY] && MENUOPTION==1 && music_volume<127) {
                              music_volume++;
//                            Mix_VolumeMusic(music_volume);
                        } /* if */ 
                        if (keyboard[LEFT_KEY] && MENUOPTION==1 && music_volume>0) {
                              music_volume--;
//                            Mix_VolumeMusic(music_volume);
                        } /* if */ 
                        if (keyboard[RIGHT_KEY] && MENUOPTION==2 && sfx_volume<127) {
                              sfx_volume++;
                              SetSFXVolume(sfx_volume);
                        } /* if */ 
                        if (keyboard[LEFT_KEY] && MENUOPTION==2 && sfx_volume>0) {
                              sfx_volume--;
                              SetSFXVolume(sfx_volume);
                        } /* if */ 

                  }
                  break;

      } /* switch */ 

      old_room_demonroom=room_demonroom;

      /* Borrar los bordes de la pantalla: */ 
      if (STATE==4 || STATE==16) {
            B_rectangle(screen,0,0,GAME_VIEW_X,dy,dx,0);
            B_rectangle(screen,GAME_VIEW_X+32*TILE_SIZE_X,0,dx-(GAME_VIEW_X+32*TILE_SIZE_X),dy,dx,0);
            B_rectangle(screen,GAME_VIEW_X,GAME_VIEW_Y+20*TILE_SIZE_Y,32*TILE_SIZE_X,dy-(GAME_VIEW_Y+20*TILE_SIZE_Y),dx,0);
      } /* if */ 


      /* Control de pantalla: */ 
      if (STATE==4 || STATE==16) {
            int zx,zy;

            zx=zoom;
            zy=int((float(zoom)*(400.0-float(GAME_VIEW_Y)))/640.0);

            logic_dx[0]=physic_dx[0]=640;
            logic_dy[0]=physic_dy[0]=GAME_VIEW_Y;
            logic_x[0]=physic_x[0]=0;
            logic_y[0]=physic_y[0]=0;

            logic_dx[1]=zx;
            logic_dy[1]=zy;
            logic_x[1]=max(min(640-zx,GAME_VIEW_X+pers_x-(zx/2-TILE_SIZE_X)),0);
            logic_y[1]=max(min(400-zy,GAME_VIEW_Y+pers_y-zy/2),GAME_VIEW_Y);

            physic_x[1]=0;
            physic_y[1]=GAME_VIEW_Y;
            physic_dx[1]=640;
            physic_dy[1]=400-GAME_VIEW_Y;
      
      } else {
            logic_dx[0]=physic_dx[0]=640;
            logic_dy[0]=physic_dy[0]=400;
            logic_x[0]=physic_x[0]=0;
            logic_y[0]=physic_y[0]=0;

            logic_dx[1]=physic_dx[1]=0;
      } /* if */ 

      /* Viejo estado del teclado: */ 
      for(int i=0;i<SDLK_LAST;i++) old_keyboard[i]=keyboard[i];

      cycle++;
} /* GameCycle */ 


void drawcharacter(BYTE *screen,int dx,int dy)
{
      int oldc=character;

      if (hit_time>0 && pers_pos<9) {
            if (((hit_time>>1)&0x01)!=0) character=2;
                                                else character=0;
      } /* if */ 
      if (pers_right) {
            if (to_enter_cut==0) {
                  tiles[character_tile[character]+pers_pos]->
                        draw(GAME_VIEW_X+pers_x,GAME_VIEW_Y+pers_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
            } else {
                  tiles[character_tile[character]+pers_pos]->
                        draw_cut(GAME_VIEW_X+pers_x,GAME_VIEW_Y+pers_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx,to_enter_cut);
            } /* if */ 
            if (sword) {
                  tiles[sword_tile[oldc]]->
                        draw(GAME_VIEW_X+sword_x,GAME_VIEW_Y+sword_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                  tiles[sword_tile[oldc]]->
                        draw_only_mask(GAME_VIEW_X+sword_x,GAME_VIEW_Y+sword_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2+TILE_UNIT,col_buffer,dx,dy,dx);
                  tiles[sword_tile[oldc]]->
                        draw_only_mask(GAME_VIEW_X+sword_x,GAME_VIEW_Y+sword_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2-TILE_UNIT,col_buffer,dx,dy,dx);
            } /* if */ 
      } else {
            if (to_enter_cut==0) {
                  tiles[character_tile_inv[character]+pers_pos]->
                        draw(GAME_VIEW_X+pers_x,GAME_VIEW_Y+pers_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
            } else {
                  tiles[character_tile_inv[character]+pers_pos]->
                        draw_cut(GAME_VIEW_X+pers_x,GAME_VIEW_Y+pers_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx,to_enter_cut);
            } /* if */ 
            if (sword) {
                  tiles[sword_tile[oldc]+1]->
                        draw(GAME_VIEW_X+sword_x,GAME_VIEW_Y+sword_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2,screen,col_buffer,dx,dy,dx);
                  tiles[sword_tile[oldc]+1]->
                        draw_only_mask(GAME_VIEW_X+sword_x,GAME_VIEW_Y+sword_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2+TILE_UNIT,col_buffer,dx,dy,dx);
                  tiles[sword_tile[oldc]+1]->
                        draw_only_mask(GAME_VIEW_X+sword_x,GAME_VIEW_Y+sword_y,
                               TILE_SIZE_X*2,TILE_SIZE_Y*2-TILE_UNIT,col_buffer,dx,dy,dx);
            } /* if */ 
      } /* if */ 
      character=oldc;
} /* drawcharacter */ 

Generated by  Doxygen 1.6.0   Back to index