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;
}
}
}