int main(int argc, char **argv) { // vecalabeth

  SetFrameRate(30);
  IntensitySprite(60);

  textSize = {40,5};

  D=DrawTo;
  M=MoveTo;

  luckynumber = 1;
  framecount = 0;
  hpincrementer = 0;

  outsideX = 0;
  outsideY = 0;

  mon = 0;
  monlocation = 0;

  sprintf(currentArray, "NONE");
  /* Dim arrayCache; */

  gameLevel = 1;
  /* Dim level[81,5]; */

  monsters = {"BALRON","MINOTAUR","GREMLIN","MIMIC","CARRION CREEPER","SNAKE","ORC","RAT","THIEF","SKELETON"};
  
  playerTypes = {"FIGHTER","MAGE"};
  
  monsterHP = {21,19,17,15,13,11,9,7,5,3,1};

  // Stores player details. 1 + 2 = X + Y coords. 3 = Direction Facing, 4 = food, 5 = hp, 6 = gold, 7=inside/outside (0/1),
  // 8=strength, 9=dex, 10=stam, 11=wisdom, 12=rapier, 13=axe, 14=shield, 15=bow, 16=amulet, 17=quest, 18=questdone,
  // 19=equipped item, 20=player type

  playerDetails = {(Rand() % 19) + 2,(Rand() % 19) + 2,1,0,99,0,0,25,25,25,25,0,0,0,0,0,0,0,0,1};

  controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  while (controls[1,3] == 0) {
    framecount += 1;
    //only allow one move every so often

    if (framecount >= GetFrameRate()/4) {
      clearScreen();
      TextSizeSprite(textSize);
      
      instructions = {{-50,90,"VECALABETH"},
                      {-120,70,"ORIGINAL BY RICHARD GARRIOTT - 1979"},
                      {-70,50,"PORTED BY PIX - 2018"},
                      {-120,30,"WELCOME TO AKALABETH, WORLD OF DOOM!"}};
      
      TextListSprite(instructions);
      controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
    }
  }
  framecount = 0;

  while (controls[1,3] == 0 || framecount <= GetFrameRate()/2) {
    framecount += 1;
    clearScreen();
    TextSizeSprite(textSize);

    instructions = {{-120,90,"SELECT THY LUCKY NUMBER...."},
                    {-120,70," " + luckynumber}};
    
    TextListSprite(instructions);
    if (framecount >= GetFrameRate()/2) {
      if (controls[1,2] < 0 && luckynumber > 1) {
        framecount = 0;
        luckynumber -= 1;
      } else if (controls[1,2] > 0 && luckynumber < 10) {
        framecount = 0;
        luckynumber += 1;
      }
    }
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  }
  framecount = 0;

  while (controls[1,3] == 0 || framecount <= GetFrameRate()/2) {
    framecount += 1;
    clearScreen();
    TextSizeSprite(textSize);
    
    instructions = {{-50,90,"LEVEL OF PLAY (1-10)"},
                    {-50,70," " + gameLevel}};
    
    TextListSprite(instructions);
    if (framecount >= GetFrameRate()/2) {
      if (controls[1,2] < 0 && gameLevel > 1) {
        framecount = 0;
        gameLevel -= 1;
      } else if (controls[1,2] > 0 && gameLevel < 10) {
        framecount = 0;
        gameLevel += 1;
      }
    }
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  }
  framecount = 0;

  Stats(1);

  framecount = 0;
  while (controls[1,3] == 0  || framecount <= GetFrameRate()/2) {
    framecount += 1;
    clearScreen();
    TextSizeSprite(textSize);
    
    instructions = {{-90,90,"SHALT THOU BE A FIGHTER OR A MAGE?"},
                    {-90,70,playerTypes[playerDetails[20]]}};
    TextListSprite(instructions);
    if (framecount >= GetFrameRate()/2) {
      if (controls[1,2] != 0) {
        if (playerDetails[20] == 1) {
          playerDetails[20] = 2;
        } else {
          playerDetails[20] = 1;
        }
        framecount = 0;
      }
    }
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  }
  framecount = 0;

  // Create the outside terrain
  /* Dim outsideMap[21,21]; */

  for (x = 1; x <= 21; x++) {
    outsideMap[x, 1] = 1;
    outsideMap[1, x] = 1;
    outsideMap[x, 21] = 1;
    outsideMap[21, x] = 1;
  } // x

  for (x = 2; x <= 20; x++) {
    for (y = 2; y <= 20; y++) {
      outsideMap[x, y] = (int)((((Rand() % 101) / 100.0) ^ 5) * 4.5);
      if (outsideMap[x, y] == 3 && (Rand() % 2) > 0) {
        outsideMap[x, y] = 0;
      }
    } // y
  } // x

  outsideMap[(Rand() % 19) + 2, (Rand() % 19) + 2] = 5;
  outsideMap[playerDetails[1],playerDetails[2]] = 3;

  //1=balron 2=minotaur 3=gremlin 4=mimic 5=carrioncreeper 6=snake 7=orc
  //8=rat 9=thief 10=skeleton 11=upladder 12=chest 13=downladder
  //14=trap(visible) 15 = trap(invisible)
  //1-4 = wall type N,E,S,W. 5 = contents of room

  /* Dim level[81,5]; */

  scaler = {84,55,37,26,15,12,7,5,4};

  Shop();

  framecount = 0;
  showPositionO();
  for (;;) {
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
    framecount += 1;
    //only allow one move every so often

    if (framecount >= GetFrameRate()/4) {
      if (playerDetails[5] <=0) {
        deaded();
      }
      if (controls[1,5] == 1) {
        Stats(0);
        framecount = 0;
      }
      if (controls[1,6] == 1) {
        Inv();
        framecount = 0;
      }
      if (playerDetails[7] > 0) {
        //inside a dungeon
        if (controls[1,3] != 0) {
          if (level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] == 12) { //chest
            chest();
          } else if (level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] == 13) { //ladderdown
            playerDetails[7] += 1;
            generateLevels();
            AddMonsters();
            framecount = 0;
            showPositionD();
          } else if (level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] == 11) { //ladderup
            playerDetails[7] -= 1;
            if (playerDetails[7] == 0) {
              playerDetails[1] = outsideX;
              playerDetails[2] = outsideY;
              playerDetails[5] += hpincrementer;
              hpincrementer = 0;
              framecount = 0;
              showPositionO();
            } else {
              generateLevels();
              AddMonsters();
              framecount = 0;
              showPositionD();
            }
          } else if (level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] == 14) { //trap
            playerDetails[7] += 1;
            generateLevels();
            AddMonsters();
            showPositionD();
          }
        } else if (controls[1,4] != 0) {
          strike();
          framecount = 0;
          controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
          MoveMonsters();
          framecount = 0;
          showPositionD();
        }


        if (controls[1,1] < 0) {
          //turn left
          playerDetails[3] -= 1;
          framecount = 0;
          if (playerDetails[3] < 1) {
            playerDetails[3] = 4;
          }
        } else if (controls[1,1] > 0) {
          //turn right
          playerDetails[3] += 1;
          framecount = 0;
          if (playerDetails[3] > 4) {
            playerDetails[3] = 1;
          }
        }

        if (controls[1,2] < 0) {
          Move("B");
        } else if (controls[1,2] > 0) {
          Move("F");
        }
        if (framecount == 0 && playerDetails[7] > 0) {
          showPositionD();
        }
      } else if (playerDetails[7] == 0) {
        //outside
        if (controls[1,1] < 0) {
          //move left
          if (outsideMap[playerDetails[1]-1, playerDetails[2]] != 1) {
            playerDetails[1] -= 1;
            framecount = 0;
            playerDetails[4] -= 10;
            if (playerDetails[4] <=0) {
              playerDetails[4] = 0;
              playerDetails[5] -= 10;
            }
          }
        } else if (controls[1,1] > 0) {
          //move right
          if (outsideMap[playerDetails[1]+1, playerDetails[2]] != 1) {
            playerDetails[1] += 1;
            framecount = 0;
            playerDetails[4] -= 10;
            if (playerDetails[4] <=0) {
              playerDetails[4] = 0;
              playerDetails[5] -= 10;
            }
          }
        } else if (controls[1,2] < 0) {
          //move down
          if (outsideMap[playerDetails[1], playerDetails[2]-1] != 1) {
            playerDetails[2] -= 1;
            framecount = 0;
            playerDetails[4] -= 10;
            if (playerDetails[4] <=0) {
              playerDetails[4] = 0;
              playerDetails[5] -= 10;
            }
          }
        } else if (controls[1,2] > 0) {
          //move up
          if (outsideMap[playerDetails[1], playerDetails[2]+1] != 1) {
            playerDetails[2] += 1;
            framecount = 0;
            playerDetails[4] -= 10;
            if (playerDetails[4] <=0) {
              playerDetails[4] = 0;
              playerDetails[5] -= 10;
            }
          }
        } else if (controls[1,3] != 0) {
          //press fire
          if (outsideMap[playerDetails[1], playerDetails[2]] == 4) { //dungeon
            outsideX = playerDetails[1];
            outsideY = playerDetails[2];
            playerDetails[1] = 1;
            playerDetails[2] = 1;
            playerDetails[3] = 3;
            playerDetails[7] = 1;
            generateLevels();
            AddMonsters();
            showPositionD();
            framecount = 0;
          } else if (outsideMap[playerDetails[1], playerDetails[2]] == 3) {
            framecount = 0;
            shop();
            framecount = 0;
          } else if (outsideMap[playerDetails[1], playerDetails[2]] == 5) {
            framecount = 0;
            fprintf(stderr, "entering castle\n");
            LB();
            framecount = 0;
          }
        }
        if (framecount == 0 && playerDetails[7] == 0) {
          showPositionO();
        }
      }
    }
  } // while
} //main

void showPositionD(void) {
  clearScreen();
  drawnMonster = false;
  left = playerDetails[3] - 1;
  right = playerDetails[3] + 1;
  back  = playerDetails[3] + 2;
  scale = 250;
  if (left == 0) {
   left = 4;
  }
  if (left == 5) {
    left = 1;
  }
  if (back == 5) {
   back = 1;
  }
  if (back == 6) {
    back = 2;
  }
  if (right == 0) {
    right = 4;
  }
  if (right == 5) {
    right = 1;
  }

  x=playerDetails[1];
  y=playerDetails[2];
  runcount = 1;

  mon = 0;
  monlocation = 0;
  monsterdrawrun = 0;
  do {
    /* Dim WallLines; */

    if (runcount != 1) {
      if (playerDetails[3] == 1) {
         y -= 1;
       } else if (playerDetails[3] == 2) {
         x += 1;
       } else if (playerDetails[3] == 3) {
         y += 1;
       } else if (playerDetails[3] == 4) {
         x -= 1;
       }
    }

    if (monsterdrawrun == 0) {
      if (level[x + ((y-1) *9),left] == 1 || level[x + ((y-1) *9),left] == 2 || level[x + ((y-1) *9),left] == 3 ) {
	 
        WallLines = {{MoveTo,-60,60},{DrawTo,-40,40},{MoveTo,-40,-40},{DrawTo,-60,-60}};
	 
      } else {

        WallLines = {{MoveTo,-60,40},{DrawTo,-40,40},{DrawTo,-40,-40},{DrawTo,-60,-40}};
	 
        if (level[x + ((y-1) *9),back] == 1 || level[x + ((y-1) *9),back] == 2 || level[x + ((y-1) *9),back] == 3) {

          WallLines = AppendArrays(WallLines,{{MoveTo,-60,-40},{DrawTo,-60,40}});
	 
        } else {
	 
          WallLines = AppendArrays(WallLines,{{MoveTo,-60,-60},{DrawTo,-60,60}});

        }
        if (runcount > 1 && (level[x + ((y-1) *9),back] == 2 || level[x + ((y-1) *9),back] == 3)) {

          WallLines = AppendArrays(WallLines,{{MoveTo,-60,-60},{DrawTo,-60,60}});
	 
        }
      }

      if (level[x + ((y-1) *9),left] == 2) {
       
        WallLines = AppendArrays(WallLines,{{MoveTo,-55,-55},{DrawTo,-55,35},{DrawTo,-45,30},{DrawTo,-45,-45}});
       
      }

      if (level[x + ((y-1) *9),playerDetails[3]] == 1 || level[x + ((y-1) *9),playerDetails[3]] == 2 || level[x + ((y-1) *9),playerDetails[3]] == 3) {

        WallLines = AppendArrays(WallLines,{{MoveTo,-40,40},{DrawTo,-40,-40},{DrawTo,40,-40},{DrawTo,40,40},{DrawTo,-40,40}});
	
      }

      if (level[x + ((y-1) *9),playerDetails[3]] == 2) {

        WallLines = AppendArrays(WallLines,{{MoveTo,-20,-40},{DrawTo,-20,20},{DrawTo,20,20},{DrawTo,20,-40}});
	
      }

      if (level[x + ((y-1) *9),right] == 1 || level[x + ((y-1) *9),right] == 2 || level[x + ((y-1) *9),right] == 3) {

        WallLines = AppendArrays(WallLines,{{MoveTo,60,60},{DrawTo,40,40},{MoveTo,40,-40},{DrawTo,60,-60}});
	
      } else {
	
        WallLines = AppendArrays(WallLines,{{MoveTo,60,40},{DrawTo,40,40},{DrawTo,40,-40},{DrawTo,60,-40}});
	
        if (level[x + ((y-1) *9),back] == 1 || level[x + ((y-1) *9),back] == 2 || level[x + ((y-1) *9),back] == 3) {

	  WallLines = AppendArrays(WallLines,{{MoveTo,60,-40},{DrawTo,60,40}});
	    
        } else {

          WallLines = AppendArrays(WallLines,{{MoveTo,60,-60},{DrawTo,60,60}});
	  
        }
        if (runcount > 1
	    && (level[x + ((y-1) *9),back] == 2 || level[x + ((y-1) *9),back] == 3)
	   ) {

	  WallLines = AppendArrays(WallLines,{{MoveTo,60,-60},{DrawTo,60,60}});
	    
        }
      }

      if (level[x + ((y-1) *9),right] == 2 ) {
	
        WallLines = AppendArrays(WallLines,{{MoveTo,55,-55},{DrawTo,55,35},{DrawTo,45,30},{DrawTo,45,-45}});
	
      }
      returnToOriginSprite();
      //MoveSprite(1,1)
      //MoveSprite(-1,-1)
      ScaleSprite(scale);
      sprite = LinesSprite(WallLines);
    }
    if (level[x + ((y-1) *9),5] == 1  && drawnMonster == false) {
      DrawBalron(scale);
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
      drawnMonster = true;
    } else if (level[x + ((y-1) *9),5] == 2 && drawnMonster == false) {
      DrawMinotaur(scale);
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
      drawnMonster = true;
    } else if (level[x + ((y-1) *9),5] == 3 && drawnMonster == false) {
      DrawGremlin(scale);
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
      drawnMonster = true;
    } else if (level[x + ((y-1) *9),5] == 4) {
      DrawChest(scale);
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
    } else if (level[x + ((y-1) *9),5] == 5 && drawnMonster == false) {
      DrawCarrionCreeper(scale);
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
    } else if (level[x + ((y-1) *9),5] == 6 && drawnMonster == false) {
      DrawSnake(scale);
      drawnMonster = true;
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
    } else if (level[x + ((y-1) *9),5] == 7 && drawnMonster == false) {
      DrawOrc(scale);
      drawnMonster = true;
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
    } else if (level[x + ((y-1) *9),5] == 8 && drawnMonster == false) {
      DrawRat(scale);
      drawnMonster = true;
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
    } else if (level[x + ((y-1) *9),5] == 9 && drawnMonster == false) {
      DrawThief(scale);
      drawnMonster = true;
      mon = level[x + ((y-1) *9),5];
      fprint(stderr, "setting mon to %d\n", mon);
      monlocation = x + ((y-1) *9);
    } else if (level[x + ((y-1) *9),5] == 10 && drawnMonster == false) {
      DrawSkeleton(scale);
      drawnMonster = true;
      mon = level[x + ((y-1) *9),5];
      monlocation = x + ((y-1) *9);
    } else if (level[x + ((y-1) *9),5] == 11 && monsterdrawrun == 0) {
      DrawUpLadder(scale);
    } else if (level[x + ((y-1) *9),5] == 12 && monsterdrawrun == 0) {
      DrawChest(scale);
    } else if (level[x + ((y-1) *9),5] == 13 && monsterdrawrun == 0) {
      DrawDownLadder(scale);
    } else if (level[x + ((y-1) *9),5] == 14 && monsterdrawrun == 0) {
      DrawTrap(scale);
    }

    scale -= scaler[runcount];
    if (monsterdrawrun == 1) {
      monsterdrawrun = 2;
    } else if (level[x + ((y-1) *9 ),playerDetails[3]] == 2 || level[x + ((y-1) *9 ),playerDetails[3]] == 3 && runcount == 1) {
      monsterdrawrun = 1;
    } else if (level[x + ((y-1) *9 ),playerDetails[3]] == 2 || level[x + ((y-1) *9 ),playerDetails[3]] == 3 && runcount > 1) {
      monsterdrawrun = 2;
    }
    runcount += 1;
  } while (! (level[x + ((y-1) *9 ),playerDetails[3]] = 1 || monsterdrawrun = 2) );

  returnToOriginSprite();
  
  position     = {{-120,-110,"FOOD=" + playerDetails[4]/10},
                  {-120,-120,"HP=" + playerDetails[5]}};
  
  TextListSprite(position);
}

void showPositionO(void) {
  // draw the outside map which is a 3x3 grid around the player position
  returnToOriginSprite();
  clearScreen();
  scale = 140;
  for (x=playerDetails[1]-1; x <= playerDetails[1]+1; x++) {
    for (y=playerDetails[2]-1; y <= playerDetails[2]+1; y++) {
      if (outsideMap[x,y] == 1) { // draw mountain
        DrawMountain(x,y,scale);
      } else if (outsideMap[x,y] == 2) { //draw village
        DrawVillage(x,y,scale);
      } else if (outsideMap[x,y] == 3) { //draw town
        DrawTown(x,y,scale);
      } else if (outsideMap[x,y] == 4) { //draw dungeon
        DrawDungeon(x,y,scale);
      } else if (outsideMap[x,y] == 5) { //draw castle
        DrawCastle(x,y,scale);
      }
    } // y
  } // x
  drawPlayer(scale);

  returnToOriginSprite();

  TextSizeSprite(textSize);
  
  position     = {{-120,-110,"FOOD=" + playerDetails[4]/10},
                  {-120,-120,"HP=" + playerDetails[5]}};
  
  TextListSprite(position);
}

void drawLineSprite(Lines,scale) {
  returnToOriginSprite();
  //MoveSprite(1,1)
  //MoveSprite(-1,-1)
  ScaleSprite(scale);
  sprite = LinesSprite(Lines);
}

void drawDotsSprite(modeDots,scale) {
  returnToOriginSprite();
  //MoveSprite(1,1)
  //MoveSprite(-1,-1)
  ScaleSprite(scale);
  sprite = DotsSprite(modeDots);
}

void drawLines(array, scale) {
  z = -50;
  scale = scale * 0.9;
  /* Dim line; */
  for (i = 1; i <= UBound(array,1); i++) {
    if (array[i,1] == M) {
      if (i > 1) {
        drawLineSprite(line, scale);
      }
      
      line = {{MoveTo,array[i,2],array[i,3]+z}};
      
    } else {

      line = AppendArrays(line,{{DrawTo,array[i,2],array[i,3]+z}});
      
    }
  } // i
  drawLineSprite(line, scale);
}

void drawOutsideLines(x, y, array, scale) {
  blocksize = 50;
  returnToOriginSprite();
  //MoveSprite(1,1)
  //MoveSprite(-1,-1)
  ScaleSprite(scale);
  MoveSprite((x-playerDetails[1])*blocksize,(y-playerDetails[2])*blocksize);
  sprite = LinesSprite(array);
}


void drawSkeleton(scale) {

  drawLines (buildArray("SKELETON",41,3),scale);

  z = -50;
  scale = scale * 0.9;

  Dots = {{5,72+z},{-5,72+z}};
  
  drawDotsSprite(Dots,scale);

}

void drawPlayer(scale) {

  drawOutsideLines (playerDetails[1], playerDetails[2], {{M,2,0},{D,-2,0},{M,0,2},{D,0,-2}},scale);

}

void drawVillage(x, y, scale) {
  
  drawOutsideLines (x, y, {{M,5,5},{D,-5,5},{D,-5,-5},{D,5,-5},{D,5,5}},scale);
  
}

void drawDungeon(x, y, scale) {
  
  drawOutsideLines (x, y, {{M,5,-5},{D,-5,5},{M,-5,-5},{D,5,5}},scale);
  
}

void drawTrap(scale) {
  
  drawLines ({{M,-30,5},{D,30,5},{D,40,-5},{D,-40,-5},{D,-30,5}},scale);
  
}

void drawUpLadder(scale) {
  drawLines (buildArray("UPLADDER",19,3),scale);
}

void drawDownLadder(scale) {
  drawLines (buildArray("DOWNLAD",19,3),scale);
}

void drawMountain(x, y, scale) {
  drawOutsideLines (x, y, buildArray("MOUNTAIN",21,3),scale);
}

array *buildArray(fName, x, y) {
  if (strComp(currentArray,fName) == 0) {
    fprintf(stderr, "from cache\n");
    return arrayCache;
  }
  /* free(array); */
  /* Dim array[x,y]; */
  file = FOpen(fName,"r");
  for (a = 1; a <= x; a++) {
    for (b = 1; b <= y; b++) {
      s = FGets(file);
      array[a,b] = convArrayVal(s);
    } // b
  } // a
  FClose(file);
  currentArray = fName;
  arrayCache = array;
  return array;
}

void drawCastle(x, y, scale) {

  drawOutsideLines (x, y,{{M,25,25},{D,-25,25},{D,-25,-25},{D,25,-25},{D,25,25},{M,15,15},
                          {D,15,-15},{D,-15,-15},{D,-15,15},{D,15,15},{D,-15,-15},{M,15,-15},{D,-15,15}},scale);
	
}

void drawTown(x, y, scale) {
  
  drawOutsideLines (x, y,{{M,15,15},{D,5,15},{D,5,-15},{D,15,-15},{D,15,-5},{D,-15,-5},
                          {D,-15,-15},{D,-5,-15},{D,-5,15},{D,-15,15},{D,-15,5},{D,15,5},{D,15,15}},scale);
  
}

void drawThief(scale) {
  drawLines (buildArray("THIEF",21,3),scale);
}

void drawRat(scale) {
  drawLines (buildArray("RAT",21,3),scale);
}

int convArrayVal(val) {
  if (StrComp(Mid(val,1,1),"M") == 0) {
    return MoveTo;
  } else if (StrComp(Mid(val,1,1),"D") == 0) {
    return DrawTo;
  } else {
    return stringToInt(val);
  }
}

void drawOrc(scale) {
  drawLines (buildArray("ORC",47,3),scale);
}

void drawSnake(scale) {
  drawLines (buildArray("SNAKE",39,3),scale);
}

void drawCarrionCreeper(scale) {
  drawLines (buildArray("CARRION",34,3),scale);
}

void drawChest(scale) {
  
  drawLines ({{M,13,0},{D,13,10},{D,-7,10},{D,-7,0},{D,13,0},
              {M,13,10},{D,8,15},{D,-12,15},{D,-12,5},{D,-7,0},
              {M,-7,10},{D,-12,15}},scale);
  
}

void drawGremlin(scale) {
  
  drawLines ({{M,-5.5,10},{D,4.5,10},{D,0,15},{D,-10,20},{D,-5.5,15},{D,-5.5,10},
              {M,-5.5,10},{D,-7.5,6},{D,-5.5,3},{D,4.5,3},{D,6.5,6},{D,4.5,10},
              {M,-2.5,3},{D,-5.5,0},{D,-8,0},{M,1.5,3},{D,4.5,0},{D,8,0},{M,-3.5,5},{D,2.5,5}},scale);
  
  z = -50;
  scale = scale * 0.9;
  
  Dots = {{-3.5,8+z},{2.5,8+z}};
  
  drawDotsSprite(Dots,scale);
}

void drawBalron(scale) {
  drawLines (buildArray("BALRON",86,3),scale);
}

void drawMinotaur(scale) {
  drawLines (buildArray("MINOTAUR",122,3),scale);
}

void Shop() {

  selectionList = {"QUIT","FOOD","RAPIER","AXE","SHIELD","BOW","AMULET","NOT ENOUGH GOLD","BOUGHT"};
  
  selection = 1;
  oldselection=1;
  controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  exitLoop = 0;
  firstTime = 1;
  while (exitLoop == 0) {
    framecount += 1;
    // only allow one move every so often

    if (framecount >= GetFrameRate()/4) {

      if (controls[1,2] < 0 && selection > 1 && selection <8) {
        selection -= 1;
      } else if (controls[1,2] > 0 && selection < 7) {
        selection += 1;
      }
      // strip out some of the shopping text since the Vectrex can't cope!

      instructions = {{-120,50, "PRICE  ITEM"},
                      {-120,30, "1      FOOD(10)"},
                      {-120,10, "8      RAPIER"},
                      {-120,-10,"5      AXE"},
                      {-120,-30,"6      SHIELD"},
                      {-120,-50,"3      BOW"},
                      {-120,-70,"15     AMULET"},
                      {-120,-90,"CMD?" + selectionList[selection]}};

      if (controls[1,3] == 1) {
        if (selection == 1 && firstTime == 0) {
          exitLoop = 1;
        } else if (selection == 2) {
          if (playerDetails[6] >= 1) {
            playerDetails[6] -= 1;
            playerDetails[4] += 100;
            oldselection=selection;
            selection=9;
          } else {
            oldselection=selection;
            selection=8;
          }
        } else if (selection == 3) {
          if (playerDetails[20] == 2) {
            MagesCant();
            framecount = 0;
          } else {
            if (playerDetails[6] >= 8) {
              playerDetails[6] -= 8;
              playerDetails[12] += 1;
              oldselection=selection;
              selection=9;
            } else {
              oldselection=selection;
              selection=8;
            }
          }
        } else if (selection == 4) {
            if (playerDetails[6] >= 5) {
            playerDetails[6] -= 5;
            playerDetails[13] += 1;
            oldselection=selection;
            selection=9;
           } else {
            oldselection=selection;
            selection=8;
          }
        } else if (selection == 5) {
          if (playerDetails[6] >= 6) {
            playerDetails[6] -= 6;
            playerDetails[14] += 1;
            oldselection=selection;
            selection=9;
          } else {
            oldselection=selection;
            selection=8;
          }
        } else if (selection == 6) {
          if (playerDetails[20] == 2) {
            MagesCant();
            framecount = 0;
          } else {
            if (playerDetails[6] >= 3) {
              playerDetails[6] -= 3;
              playerDetails[15] += 1;
              oldselection=selection;
              selection=9;
            } else {
              oldselection=selection;
              selection=8;
            }
          }
        } else if (selection == 7) {
          if (playerDetails[6] >= 15) {
            playerDetails[6] -= 15;
            playerDetails[16] += 1;
            oldselection=selection;
            selection=9;
          } else {
            oldselection=selection;
            selection=8;
            }
        } else if (selection == 8 || selection == 9) {
          selection = oldselection;
        }
        firstTime = 0;
      }

      ClearScreen();
      TextSizeSprite(textSize);
      TextListSprite(instructions);
      framecount = 0;
    } // if
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  } // while
}

void Inv(void) {

  selectionList = {"QUIT","EQUIP RAPIER","EQUIP AXE","EQUIP SHIELD","EQUIP BOW","EQUIP AMULET","STATS","NOT OWNED!","EQUIPPED"};
  
  selection = 1;
  oldselection=1;
  controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  exitLoop = 0;
  while (exitLoop == 0) {
    framecount += 1;
    //only allow one move every so often

    if (framecount >= GetFrameRate()/4) {

      if (controls[1,2] < 0 && selection > 1 && selection <8) {
        selection -= 1;
      } else if (controls[1,2] > 0 && selection < 6) {
        selection += 1;
      }

      instructions = {{-120,90,"FOOD....." + playerDetails[4]/10},
                      {-120,70,"RAPIER......." + playerDetails[12]},
                      {-120,50,"AXE......" + playerDetails[13]},
                      {-120,30,"SHIELD........" + playerDetails[14]},
                      {-120,10,"BOW........." + playerDetails[15]},
                      {-120,-10,"AMULET.........." + playerDetails[16]},
		      {-120,-90,"CMD?" + selectionList[selection]}};
      

      if (controls[1,3] == 1) {
        if (selection == 1) {
          exitLoop = 1;
        } else if (playerDetails[20] == 2 && (selection == 2 || selection == 5)) {
          MagesCant();
          framecount=0;
        } else if (selection >= 2 && selection <=6) {
          if (playerDetails[selection + 10] > 0) {
            playerDetails[19] = selection + 10;
            oldselection=selection;
            selection=9;
          } else {
            oldselection=selection;
            selection=8;
          }
        } else if (selection == 7) {
          Stats(0);
          framecount = 0;
        } else if (selection == 8 || selection == 9) {
          selection = oldselection;
        }
      }

      ClearScreen();
      TextSizeSprite(textSize);
      TextListSprite(instructions);
      framecount = 0;
    }
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  } // while
}

void rollStats(void) {
  playerDetails[5] =  round(Sqrt((Rand() % 1000)/1000.0) * 21 + 4);
  playerDetails[8] =  round(Sqrt((Rand() % 1000)/1000.0) * 21 + 4);
  playerDetails[9] =  round(Sqrt((Rand() % 1000)/1000.0) * 21 + 4);
  playerDetails[10] =  round(Sqrt((Rand() % 1000)/1000.0) * 21 + 4);
  playerDetails[11] =  round(Sqrt((Rand() % 1000)/1000.0) * 21 + 4);
  playerDetails[6] =  round(Sqrt((Rand() % 1000)/1000.0) * 21 + 4);
}

void Stats(startup) {
  if (startup == 1) {
    rollStats();
  }
  controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  framecount = 0;
  while (controls[1,3] == 0 || framecount <= GetFrameRate()) {
    framecount += 1;

    instructions = {{-120,90,"HIT POINTS....." + playerDetails[5]},
                    {-120,70,"STRENGTH......." + playerDetails[8]},
                    {-120,50,"DEXTERITY......" + playerDetails[9]},
                    {-120,30,"STAMINA........" + playerDetails[10]},
                    {-120,10,"WISDOM........." + playerDetails[11]},
		    {-120,-10,"GOLD.........." + playerDetails[6]}};

    ClearScreen();
    TextSizeSprite(textSize);
    TextListSprite(instructions);

    if (startup == 1) {
      
      instructions2 = {{-120,-50,"SHALT THOU PLAY WITH THESE QUALITIES?"},
		       {-120,-70,"1 = ACCEPT, 2 = REROLL"}};
      
      TextListSprite(instructions2);
    }
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
    if (controls[1,4] == 1 && startup == 1) {
      rollStats();
    }
  } // while
  framecount = 0;
}

void LB(void) {
  framecount = 0;
  fprintf(stderr, "pb17=%d\n", playerDetails[17]);
  controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  if (playerDetails[17] == 0) {
    ClearScreen();
    TextSizeSprite(textSize);
    
    instructions = {{-120,90,"WELCOME PEASANT INTO THE HALLS OF"},
                    {-120,70,"THE MIGHTY LORD BRITISH. HEREIN"},
                    {-120,50,"THOU MAY CHOOSE TO DARE BATTLE"},
                    {-120,30,"WITH THE EVIL CREATURES OF THE"},
                    {-120,10,"DEPTHS FOR GREAT REWARD!"}};
    
    TextListSprite(instructions);
    while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
      framecount += 1;
      controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
    } // while
    framecount = 0;
    ClearScreen();
    TextSizeSprite(textSize);
    
    instructions = {{-120,90,"DOEST THOU WISH FOR GRAND"},
		    {-120,70,"ADVENTURE?"}};
    
    TextListSprite(instructions);
    while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
      framecount += 1;
      controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
    } // while
    framecount = 0;
    ClearScreen();
    playerDetails[17] = 10;
    
    instructions = {{-120,90,"GOOD! THOU SHALT TRY TO BECOME"},
                    {-120,70,"A KNIGHT!!! THY FIRST TASK"},
                    {-120,50,"IS TO GO INTO THE DUNGEONS"},
                    {-120,30,"AND ONLY RETURN AFTER KILLING"},
		    {-120,10,"A " + monsters[playerDetails[17]]}};
    
    TextListSprite(instructions);
    TextSizeSprite(textSize);
    while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
      framecount += 1;
      controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
    } // while
    framecount = 0;
    playerDetails[8] += 1;
    playerDetails[9] += 1;
    playerDetails[10] += 1;
    playerDetails[11] += 1;

    ClearScreen();

    instructions = {{-120,90,"GO NOW UPON THIS QUEST, AND"},
                    {-120,70,"MAY LADY LUCK BE FAIR UNTO YOU"},
                    {-120,50,"ALSO I, BRITISH, HAVE INCREASED"},
                    {-120,30,"EACH OF THY ATTRIBUTES BY 1"}};
    
    TextListSprite(instructions);
    TextSizeSprite(textSize);
    while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
      framecount += 1;
      controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
    } // while
    framecount = 0;
  } else {
    if (playerDetails[18] == 1) {
      playerDetails[18] = 0;
      playerDetails[17] -= 1;
      ClearScreen();

      instructions = {{-120,90,"AAHH!!....."},
                      {-120,70,"THOU HAST ACCOMPLISHED THY QUEST!"}};
      
      playerDetails[8] += 1;
      playerDetails[9] += 1;
      playerDetails[10] += 1;
      playerDetails[11] += 1;
      TextSizeSprite(textSize);
      TextListSprite(instructions);
      while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
        framecount += 1;
        controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
      } // while
      framecount = 0;
      ClearScreen();
      if (playerDetails[17] > 0) {

        instructions = {{-120,90,"UNFORTUNATELY, THIS IS NOT"},
                        {-120,70,"ENOUGH TO BECOME A KNIGHT"},
                        {-120,50,"NOW THOU MUST KILL A"},
                        {-120,30,monsters[playerDetails[17]]}};
	
        TextSizeSprite(textSize);
        TextListSprite(instructions);
        while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
          framecount += 1;
          controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
        } // while
        framecount = 0;
      } else {

        instructions = {{-120,90,"THOU HAS PROVED THYSELF WORTHY"},
                        {-120,70,"OF KNIGHTHOOD, CONTINUE PLAY"},
                        {-120,50,"IF (THOU DOTH WISH, BUT THOU HAST"},
                        {-120,30,"ACCOMPLISHED THE MAIN OBJECTIVE"},
                        {-120,10,"OF THIS GAME..."}};
	
        TextSizeSprite(textSize);
        TextListSprite(instructions);
        while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
          framecount += 1;
          controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
        } // while
        framecount = 0;
        ClearScreen();
        if (gameLevel < 10) {
	  
          instructions = {{-120,90,"NOW MAYBE THOU ART FOOLHARDY"},
                          {-120,70,"ENOUGH TO TRY DIFFICULTY"},
                          {-120,50,"LEVEL " + (gameLevel + 1)}};
	  
        } else {

          instructions = {{-120,90,"REPORT THIS AMAZING FEAT TO"},
                          {-120,70,"LORD BRITISH (@RICHARDGARRIOTT)"}};
	  
        }
        TextSizeSprite(textSize);
        TextListSprite(instructions);
        while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
          framecount += 1;
          controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
        } // while
        framecount = 0;
      }
    } else {
      ClearScreen();
      TextSizeSprite(textSize);

      instructions = {{-120,90,"WHY HAST THOU RETURNED?"},
                      {-120,70,"THOU MUST KILL A"},
                      {-120,50,monsters[playerDetails[17]]}};
      
      TextListSprite(instructions);
      while (controls[1,3] == 0 || framecount < GetFrameRate()/4) {
        framecount += 1;
        controls = WaitForFrame(JoystickDigital,Controller1,JoystickNone);
      } // while
    }
  }
}

void Trap(void) {
  clearScreen();
  TextSizeSprite(textSize);

  instructions = {{-80,50,"AAARRRGGGHHH!!! A TRAP"}};
  
  TextListSprite(instructions);
  framecount = 0;
  while (framecount < GetFrameRate()/2 || controls[1,3] == 0 ) {
    framecount += 1;
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  }
  playerDetails[5] -= round(((Rand() % 1000)/1000) * playerDetails[7] + 3);
  playerDetails[7] += 1;
  generateLevels();
  AddMonsters();
  showPositionD();
}

void Move(direction) {
  if (((playerDetails[3] == 3 && direction == "F") || (playerDetails[3] == 1 && direction == "B")) && MoveAllowed(3)) {
    if (level[playerDetails[1] + ((playerDetails[2] * 9)-9) + 9,5] >10 || level[playerDetails[1] + ((playerDetails[2] * 9)-9) + 9,5] == 0) {
      playerDetails[2] += 1;
    }
  } else if (((playerDetails[3] == 1 && direction == "F") || (playerDetails[3] == 3 && direction == "B")) && MoveAllowed(1) ) {
    if (level[playerDetails[1] + ((playerDetails[2] * 9)-9) - 9,5] >10 || level[playerDetails[1] + ((playerDetails[2] * 9)-9) - 9,5] == 0) {
      playerDetails[2] -= 1;
    }
  } else if (((playerDetails[3] == 2 && direction == "F") || (playerDetails[3] == 4 && direction == "B")) && MoveAllowed(2) ) {
    if (level[playerDetails[1] + ((playerDetails[2] * 9)-9) + 1,5] >10 || level[playerDetails[1] + ((playerDetails[2] * 9)-9) + 1,5] == 0) {
      playerDetails[1] += 1;
    }
  } else if (((playerDetails[3] == 4 && direction == "F") || (playerDetails[3] == 2 && direction == "B")) && MoveAllowed(4) ) {
    if (level[playerDetails[1] + ((playerDetails[2] * 9)-9) - 1,5] >10 || level[playerDetails[1] + ((playerDetails[2] * 9)-9) - 1,5] == 0) {
      playerDetails[1] -= 1;
    }
  }

  if (playerDetails[7] > 0) { //inside
    playerDetails[4] -= 1;
    if (level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] == 15) {
      Trap();
    }
    MoveMonsters();
  } else {
    playerDetails[4] -= 10;
  }

  framecount = 0;

  if (playerDetails[4] <=0) {
    playerDetails[4] = 0;
    playerDetails[5] -= 10;
  }
  fprintf(stderr, "x=%d:y=%d\n", playerDetails[1], playerDetails[2];
}

int MoveAllowed(direction) {
  if (level[playerDetails[1] + ((playerDetails[2] * 9)-9),direction] != 1) {
    return true;
  } else {
    return false;
  }
}

void AddMonsters(void) {
  for (x = 1; x <= 10; x++) {
    monsterHP[x] = (2 * (11-x)) + (2 * playerDetails[7] + gameLevel);
    //removing the randomness for monsters so you get them all every level and RAND() % 10 < 4
    if ((11-x) - 2 < playerDetails[7]) {
      for (;;) {
        r = (RAND() % 80) + 1;
        if (level[r,5] == 0 && (level[r,1] != 1 || level[r,2] != 1 || level[r,3] != 1 || level[r,4] != 1)) {
          exitloop = 1;
          level[r,5] = x;
          break;
        }
      } // while
    }
  } // x
}

void MoveMonsters(void) {
  //since we basically have vertical corridors prioritize up and down

  for (z=1; z <= 81; z++) {
    if (level[z,5] > 0 && level[z,5] < 11 ) { //monster ahoy

      adjToPlayer = false;
      monsterx = z % 9;
      monstery = 1+((z - monsterx)/9);

      if ((monsterx == playerDetails[1] && monstery - playerDetails[2] <=1 && monstery - playerDetails[2] >= -1) 
              || (monstery = playerDetails[2] && monsterx - playerDetails[1] <=1 && monsterx - playerDetails[1] >= -1)) {
        adjToPlayer = true;
      }

      if (playerDetails[2]>monstery && level[z,3] != 1 && (level[z+9,5] == 0 || adjToPlayer)) {
        MoveMonster(level[z,5], z+9);
      } else if (playerDetails[2]<monstery && level[z,1] != 1 && (level[z-9,5] == 0 || adjToPlayer)) {
        MoveMonster(level[z,5], z-9);
      } else if (playerDetails[1]<monsterx && level[z,4] != 1 && (level[z-1,5] == 0 || adjToPlayer)) {
        MoveMonster(level[z,5], z-1);
      } else if (playerDetails[1]>monsterx && level[z,2] != 1 && (level[z+1,5] == 0 || adjToPlayer)) {
        MoveMonster(level[z,5], z+1);
      }
    }
  } // z
}

void MoveMonster(monster, location) {
  if (playerDetails[1] + ((playerDetails[2]-1)*9) == location) {
    AttackPlayer(monster);
  } else {
    for (z=1; z <= 81; z++) {
      if (level[z,5] == monster) {
        level[z,5] = 0;
      }
    } // z
    level[location,5] = monster;
  }
}

void AttackPlayer (monster) {
  sprintf(message1, "YOU ARE BEING ATTACKED BY A %s", monsters[monster]);
  sprintf(message2, " ");
  if ((monster == 3 || monster == 9) && RAND() % 2 == 1) {
    //thieving type monster doing some thievery
    if (monster == 3) {
      sprintf(message2, "GREMLIN STOLE SOME FOOD!!!");
      playerDetails[4] = round(playerDetails[4]/2);
    } else {
      r = RAND() % 5 + 12;
      if (playerDetails[r] > 0 && (playerDetails[r] > 1 || playerDetails[19] != r)) {
        playerDetails[r] -= 1;
        sprintf(message2, "A THIEF STOLE AN ITEM!!!");
      }
    }
  } else {
    if (RAND() % 21 - (((playerDetails[14]+1)/(playerDetails[14]+1)) -1) - playerDetails[10] + (11-monster) + playerDetails[7] < 0) {
      sprintf(message2, "MISSED");
    } else {
      hploss = round((RAND() % 1000 * (11-monster))/1000) + playerDetails[7];
      sprintf(message2, "HIT FOR %d HP", hploss);
      playerDetails[5] -= hploss;
    }
  }
  clearScreen();
  TextSizeSprite(textSize);

  instructions = {{-120,50,message1},
                  {-120,30,message2}};
  
  TextListSprite(instructions);
  framecount = 0;
  while (framecount < GetFrameRate()/2 || controls[1,3] == 0) {
    framecount += 1;
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  } // while
}

void MagesCant(void) {
  clearScreen();
  TextSizeSprite(textSize);

  instructions = {{-80,50,"I'M SORRY. MAGES CAN'T USE THAT"}};
  
  TextListSprite(instructions);
  framecount = 0;
  while (framecount < GetFrameRate()/2 || controls[1,3] == 0) {
    framecount += 1;
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  } // while
  framecount = 0;
}

int stringToInt(s) {
  r = 0;
  f = 0.0;
  prefloat = 0;
  floating = 0;
  m = 1;
  for (i = 1; i <= Len(s); i++) {
    z = Mid(s,i,1);
    if (z == "1") {
      r = (r*10) + 1;
    } else if (z == "2") {
      r = (r*10) + 2;
    } else if (z == "3") {
      r = (r*10) + 3;
    } else if (z == "4") {
      r = (r*10) + 4;
    } else if (z == "5") {
      r = (r*10) + 5;
    } else if (z == "6") {
      r = (r*10) + 6;
    } else if (z == "7") {
      r = (r*10) + 7;
    } else if (z == "8") {
      r = (r*10) + 8;
    } else if (z == "9") {
      r = (r*10) + 9;
    } else if (z == "0") {
      r = (r*10);
    } else if (z == "-") {
      m = -1;
    } else if (z == ".") {
      prefloat = (float)(r);
      floating = 1;
      r = 0;
    }
  } // i
  if (floating) {
    r = prefloat + (((float)(r))/10);
  }
  return r * m;
}

int amuletSelect(void) {
  clearScreen();
  TextSizeSprite(textSize);

  instructions = {{-80,50,"1 - LADDER UP"},
                  {-80,30,"2 - LADDER DOWN"},
                  {-80,10,"3 - KILL"},
                  {-80,-10,"4 - BAD??"}};
  
  TextListSprite(instructions);
  framecount = 0;
  while (framecount < GetFrameRate()/2 || (controls[1,3] == 0 && controls[1,4] == 0 && controls[1,5] == 0 && controls[1,6] == 0)) {
    framecount += 1;
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  }
  if (controls[1,3] == 1) {
    return 1;
  } else if (controls[1,4] == 1) {
    return 2;
  } else if (controls[1,5] == 1) {
    return 3;
  } else {
    return 4;
  }
}

void strike(void) {
  clearScreen();
  sprintf(message1, " ");
  sprintf(message2, " ");
  sprintf(message3, " ");
  sprintf(message4, " ");
  sprintf(message5, " ");
  dam = 0;
  amnotattack = 0;

  if (playerDetails[19] == 12) {
    dam = 10;
  } else if (playerDetails[19] == 13) {
    dam = 5;
  } else if (playerDetails[19] == 14) {
    dam = 1;
  } else if (playerDetails[19] == 15) {
    dam = 4;
  } else if (playerDetails[19] == 16) {
    //magic amulet
    amnotattack = 1;
    ran = RAND() % 4;
    if (playerDetails[20] == 2) {
      ran = AmuletSelect() - 1;
      clearScreen();
    }
    if (ran == 0) {
      //dont overwrite a monster with a ladder
      if (level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] < 1 || level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] > 10) {
        level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] = 11;
        sprintf(message1, "POOF! A LADDER");;
      } else {
        sprintf(message1, "FIZZLE");
      }
    } else if (ran == 1) {
      if (level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] < 1 || level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] > 10) {
        level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] = 13;
        sprintf(message1, "POOF! A LADDER");
      } else {
        sprintf(message1, "FIZZLE");
      }
    } else if (ran == 2) {
      dam = 10 + playerDetails[7];
      amnotattack = 0;
    } else {
      ran2 = RAND() % 3;
      if (ran2 == 0) {
        sprintf(message1, "YOU HAVE BEEN TURNED INTO A TOAD!");
        playerDetails[8] = 3;
        playerDetails[9] = 3;
        playerDetails[10] = 3;
        playerDetails[11] = 3;
      } else if (ran2 == 1) {
        sprintf(message1, "YOU HAVE BEEN TURNED INTO A LIZARDMAN!");
        playerDetails[8] = round(playerDetails[8]*2.5);
        playerDetails[9] = round(playerDetails[9]*2.5);
        playerDetails[10] = round(playerDetails[10]*2.5);
        playerDetails[11] = round(playerDetails[11]*2.5);
      } else if (ran2 == 2) {
        sprintf(message1, "BACKFIRE!!!!");
        playerDetails[5] = round(playerDetails[5]/2);
      }
    }
    ran = RAND() % 4;
    if (ran == 1) {
      sprintf(message5, "LAST CHARGE ON THIS AMULET!");
      playerDetails[16] -= 1;
      if (playerDetails[16] == 0) {
        playerDetails[19] = 0;
      }
    }
  }



  fprintf(stderr, "mon=%d\n", mon);
  //is this a short range attack?
  beforemon = mon;
  beforemonloc = monlocation;

  if (amnotattack == 0 && playerDetails[19]<15) {
    if (playerDetails[3] == 3 && MoveAllowed(3)) {
      monlocation = playerDetails[1] + (((playerDetails[2]+1) * 9)-9);
      mon = level[monlocation,5];
    } else if (playerDetails[3] == 1 && MoveAllowed(1)) {
      monlocation = playerDetails[1] + (((playerDetails[2]-1) * 9)-9);
      mon = level[monlocation,5];
    } else if (playerDetails[3] == 2 && MoveAllowed(2)) {
      monlocation = (playerDetails[1] +1)+ ((playerDetails[2] * 9)-9);
      mon = level[monlocation,5];
    } else if (playerDetails[3] == 4 && MoveAllowed(4)) {
      monlocation = (playerDetails[1] - 1)+ ((playerDetails[2] * 9)-9);
      mon = level[monlocation,5];
    }
  }

  if (mon == 0 && playerDetails[19] == 13 && beforemon != 0) {
    //throwing an axe
    playerDetails[13] -= 1;
    if (playerDetails[13] == 0) {
      playerDetails[19] = 0;
    }
    mon = beforemon;
    monlocation = beforemonloc;
  }

  fprintf(stderr, "mon=%d\n", mon);
  if (amnotattack == 0) {
    if (mon == 0 || mon > 10) {
      sprintf(message1, "YOU MISSED");
    } else {
      if ((playerDetails[9] * 1000) - ((Rand() % 1000) * 25) < (11-mon) * 1000) {
        fprintf(stderr, "missed by chance\n");
        sprintf(message1, "YOU MISSED");
      } else {
        dam = round((((Rand() % 1000) * dam)/1000) + playerDetails[8]/5);
        monsterHP[mon] = monsterHP[mon] - dam;
        sprintf(message1, "HIT! DAMAGE = %d", dam);
      }

      if (monsterHP[mon] < 0) {
        sprintf(message2, "YOU KILLED A %s", monsters[mon]);
        gold = (11-mon) + playerDetails[7];
        sprintf(message3, "THOU SHALT RECEIVE %d GOLD", gold);
        level[monlocation,5] = 0;
        //doesn't seem generous enough so removing the 2 divider
        hpincrementer = hpincrementer + round(playerDetails[7] * (11-mon)/2);
        fprintf(stderr, "hpincrementer=%d\n", hpincrementer);
        if (playerDetails[17] == mon && playerDetails[18] == 0) {
          playerDetails[18] = 1;
          sprintf(message4, "A QUEST HAS BEEN COMPLETED");
        }
      }
    }
  }

  instructions = {{-120,50,message1},
                  {-120,30,message2},
                  {-120,10,message3},
                  {-120,-10,message4},
		  {-120,-10,message5}};

  TextSizeSprite(textSize);
  TextListSprite(instructions);
  framecount = 0;
  while (framecount < GetFrameRate()/2 || controls[1,3] == 0) {
    framecount += 1;
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  }
}

void deaded(void) {
  clearScreen();
  TextSizeSprite(textSize);

  instructions = {{-80,50,"WE MOURN THE PASSING OF THE PEASANT"},
                  {-80,30,"AND HIS COMPUTER."},
                  {-80,10,"PRESS 1 TO INVOKE A MIRACLE"},
                  {-80,-10,"OF RESURRECTION"}};
  
  TextListSprite(instructions);
  framecount = 0;
  while (framecount < GetFrameRate()/2 || controls[1,3] == 0 ) {
    framecount += 1;
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  } // while
  stats(1);
  for (i = 13; i <= 19; i++) {
    playerDetails[i] = 0;
  } // i
  if (playerDetails[7] != 0) {
    playerDetails[1] = outsideX;
    playerDetails[2] = outsideY;
    playerDetails[7] = 0;
  }
  playerDetails[4] = 600;
  hpincrementer = 0;
  framecount = 0;
  showPositionO();
}

void chest(void) {
  gp = round(((RAND() % 1000) * 5 * playerDetails[7])/1000) + playerDetails[7];

  items = {"RAPIER","AXE","SHIELD","BOW","AMULET"};
  
  playerDetails[6] += gp;
  item = (RAND() % 5) + 1;
  playerDetails[item + 11] += 1;

  clearScreen();
  TextSizeSprite(textSize);
  level[playerDetails[1] + ((playerDetails[2] * 9)-9),5] = 0;

  instructions = {{-80,50,"GOLD!!!!! " + gp + "-PIECES OF EIGHT"}, {-80,30,"AND A " + items[item]}};
  
  TextListSprite(instructions);
  framecount = 0;
  while (framecount < GetFrameRate()/2 || controls[1,3] == 0) {
    framecount += 1;
    controls = WaitForFrame(JoystickDigital,Controller1,JoystickX + JoystickY);
  }
  framecount = 0;
  ShowPositionD();
}

void generateLevels(void) {
  // zero everything
  for (i = 1; i <= 81; i++) {
    for (j = 1; j <= 5; j++) {
      level[i,j] = 0;
    } // j
  } // i

  //put in the base walls
  for (i = 1; i <= 81; i++) {
    level[i,1] = 1;
    level[i,2] = 1;
    level[i,3] = 1;
    level[i,4] = 1;
    //level[(((i+1)*9)-1)+(2*j),k] = 1
      //} // k
    //} // j
  } // i

  for (i = 1; i <= 5; i++) {
    for (j = 1; j <= 4; j++) {
      xy = ((9*i*2)-18)+((2*j));
      yx = ((9*j*2)-10)+(2*i);
      // upped chance from 94 as too many
      if (Rand() % 100 > 97) {
        level[xy,2] = 0;
        level[xy,4] = 0;
        level[xy,5] = 15;
        level[xy + 1,4] = 0;
        level[xy - 1,2] = 0;
      }
      if (Rand() % 100 > 97) {
        level[yx,1] = 0;
        level[yx,3] = 0;
        level[yx,5] = 15;
        level[yx + 9,1] = 0;
        level[yx - 9,3] = 0;
      }
      if (Rand() % 100 > 59) {
        level[xy,2] = 0;
        level[xy,4] = 0;
        level[xy,5] = 0;
        level[xy + 1,4] = 2;
        level[xy - 1,2] = 2;
      }
      if (Rand() % 100 > 59) {
        level[yx,1] = 0;
        level[yx,3] = 0;
        level[yx,5] = 0;
        level[yx + 9,1] = 2;
        level[yx - 9,3] = 2;
      }
      if (Rand() % 100 > 59) {
        level[xy,2] = 0;
        level[xy,4] = 0;
        level[xy,5] = 0;
        level[xy + 1,4] = 3;
        level[xy - 1,2] = 3;
      }
      if (Rand() % 100 > 59) {
        level[yx,1] = 0;
        level[yx,3] = 0;
        level[yx,5] = 0;
        level[yx + 9,1] = 3;
        level[yx - 9,3] = 3;
      }
      // not enough breaks in the wall so I am adding some
      if (Rand() % 100 > 59) {
        level[xy,2] = 0;
        level[xy,4] = 0;
        level[xy,5] = 0;
        level[xy + 1,4] = 0;
        level[xy - 1,2] = 0;
      }
      if (Rand() % 100 > 59) {
        level[yx,1] = 0;
        level[yx,3] = 0;
        level[yx,5] = 0;
        level[yx + 9,1] = 0;
        level[yx - 9,3] = 0;
      }
      if (Rand() % 100 > 96) {
        level[xy,2] = 0;
        level[xy,4] = 0;
        level[xy,5] = 14;
        level[xy + 1,4] = 0;
        level[xy - 1,2] = 0;
      }
      if (Rand() % 100 > 96) {
        level[yx,1] = 0;
        level[yx,3] = 0;
        level[yx,5] = 14;
        level[yx + 9,1] = 0;
        level[yx - 9,3] = 0;
      }
      if (Rand() % 100 > 93) {
        level[xy,2] = 0;
        level[xy,4] = 0;
        level[xy,5] = 12;
        level[xy + 1,4] = 0;
        level[xy - 1,2] = 0;
      }
      if (Rand() % 100 > 93) {
        level[yx,1] = 0;
        level[yx,3] = 0;
        level[yx,5] = 12;
        level[yx + 9,1] = 0;
        level[yx - 9,3] = 0;
      }
    } // j
  } // i


  //make sure outside walls are still there...
  for (i = 1; i <= 9; i++) {
    level[i,1] = 1;
    level[(9*i)-8,4] = 1;
    level[82-i,3] = 1;
    level[9*i,2] = 1;
  } // i

  level[2,2] = 0;
  level[2,4] = 0;
  level[2,5] = 0;
  level[3,4] = 0;
  level[1,2] = 0;

  if (playerDetails[7] % 2 == 0) {
    level[25,5] = 13;
    level[57,5] = 11;
  } else if (playerDetails[7] == 1) {
    level[1,5] = 11;
    level[57,5] = 13;
  } else {
    level[25,5] = 11;
    level[57,5] = 13;
  }

  // remove walls if player trapped
  if (   level[playerDetails[1] + ((playerDetails[2] * 9)-9),1] == 1
      && level[playerDetails[1] + ((playerDetails[2] * 9)-9),2] == 1
      && level[playerDetails[1] + ((playerDetails[2] * 9)-9),3] == 1
      && level[playerDetails[1] + ((playerDetails[2] * 9)-9),4] == 1) {
    if (playerDetails[1] % 2 == 0) {
      level[playerDetails[1] + ((playerDetails[2] * 9)-9),2] = 0;
      level[playerDetails[1] + ((playerDetails[2] * 9)-9),4] = 0;
      level[playerDetails[1] + ((playerDetails[2] * 9)-9) - 1,2] = 0;
      level[playerDetails[1] + ((playerDetails[2] * 9)-9) + 1,4] = 0;
    } else {
      level[playerDetails[1] + ((playerDetails[2] * 9)-9),1] = 0;
      level[playerDetails[1] + ((playerDetails[2] * 9)-9),3] = 0;
      level[playerDetails[1] + ((playerDetails[2] * 9)-9) - 9,3] = 0;
      level[playerDetails[1] + ((playerDetails[2] * 9)-9) + 9,1] = 0;
    }
  }
}
