diff options
Diffstat (limited to 'engines/avalanche/also.cpp')
-rw-r--r-- | engines/avalanche/also.cpp | 1412 |
1 files changed, 0 insertions, 1412 deletions
diff --git a/engines/avalanche/also.cpp b/engines/avalanche/also.cpp deleted file mode 100644 index af3b6c325e..0000000000 --- a/engines/avalanche/also.cpp +++ /dev/null @@ -1,1412 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -/* - * This code is based on the original source code of Lord Avalot d'Argent version 1.3. - * Copyright (c) 1994-1995 Mike, Mark and Thomas Thurman. - */ - -#include "graph.h" -/*#include "Rodent.h"*/ -/*#include "Crt.h"*/ - -/*$R+,V-*/ - -namespace Avalanche { - -typedef matrix<0, 255, 0, 15, byte> fonttype; - -class fieldtype { -public: - integer x1, y1, x2, y2; -}; - -class linetype : public fieldtype { -public: - byte col; -}; - -struct pedtype { - integer x, y; - byte dir; -}; - -struct magictype { - byte op; /* one of the operations */ - word data; /* data for them */ -}; - -const integer numlines = 50; -const integer up = 0; -const integer right = 1; -const integer down = 2; -const integer left = 3; -const integer ur = 4; -const integer dr = 5; -const integer dl = 6; -const integer ul = 7; -const integer still = 8; - -const integer nay = maxint; - -/* Magic commands are */ - -/*N*/ const integer nix = 0; /* ignore it if this line is touched */ -/*B*/ const integer bounce = 1; /* bounce off this line */ -/*E*/ const integer exclaim = 2; /* put up a chain of scrolls */ -/*T*/ const integer transport = 3; /* enter new room */ -/*U*/ const integer unfinished = 4; /* unfinished connection */ -/*S*/ const integer special = 5; /* special call */ -/*O*/ const integer opendoor = 6; /* slowly opening door. */ - -integer gd, gm; -array<1, numlines, linetype> lines; -array<1, numlines, fieldtype> fields; -boolean do1; -byte current; -string n; -matrix<0, 29, 1, 2, string> names; -file<fonttype> f; -fonttype skinny; -byte tx, ty; -matrix<0, 79, 0, 22, char> chars; -byte cursorflash; -array<1, 15, pedtype> peds; -array<1, 15, magictype> magics; -array<9, 15, magictype> portals; -varying_string<26> flags; -string listen; - -const graphcursmasktype crosshairs = { - ((63551, 63807, 63807, 63807, 61727, 257, 897, 32765, 897, 257, 61727, 63807, 63807, 63807, 63551, 65535), - (4368, 21140, 8840, 53910, 640, 640, 31868, 33026, 31868, 640, 640, 53910, 8840, 21140, 4368, 0)), - 7, - 7 -}; - -const graphcursmasktype hook = { - ((32831, 32831, 49279, 49279, 57599, 61695, 61471, 61447, 63491, 57089, 36801, 32771, 49159, 57375, 63743, 65535), - (0, 16256, 7936, 7936, 3584, 1536, 1792, 2016, 248, 28, 8220, 12344, 8160, 1792, 0, 0)), - 2, - 9 -}; - -const graphcursmasktype tthand = { - ((62463, 57855, 57855, 57855, 57471, 49167, 32769, 0, 0, 0, 0, 32768, 49152, 57344, 61441, 61443), - (3072, 4608, 4608, 4608, 4992, 12912, 21070, 36937, 36873, 36865, 32769, 16385, 8193, 4097, 2050, 4092)), - 4, - 0 -}; - -string strf(longint x) { - string q; - string strf_result; - str(x, q); - strf_result = q; - return strf_result; -} - -void glimpse(byte ret) { /* glimpse of screen 3 */ - char sink; - hidemousecursor; - setvisualpage(3); - setcrtpagenumber(3); - showmousecursor; - do { - } while (!(~ anymousekeypressed)); - do { - } while (!anymousekeypressed); - hidemousecursor; - setvisualpage(ret); - setcrtpagenumber(ret); - showmousecursor; - while (keypressed()) sink = readkey(); -} - -void newline(byte t, integer p, integer q, integer r, integer s, byte c) { - { - linetype &with = lines[t]; - x1 = p; - y1 = q; - x2 = r; - y2 = s; - with.col = c; - } -} - -void newfield(byte t, integer p, integer q, integer r, integer s) { - { - fieldtype &with = fields[t]; ; - with.x1 = p; - with.y1 = q; - with.x2 = r; - with.y2 = s; - } -} - -void drawped(byte p) { - { - pedtype &with = peds[p]; - if (with.dir < 177) { - setcolor(p); - circle(with.x, with.y, 5); - moveto(with.x, with.y); - switch (with.dir) { - case up: - linerel(0, -5); - break; - case down: - linerel(0, 5); - break; - case left: - linerel(-7, 0); - break; - case right: - linerel(7, 0); - break; - case ul: - linerel(-7, -5); - break; - case dl: - linerel(-7, 5); - break; - case ur: - linerel(7, -5); - break; - case dr: - linerel(7, 5); - break; - } - } - } -} - -void drawup() { - byte fv; - cleardevice(); - for (fv = 1; fv <= numlines; fv ++) { - linetype &with = lines[fv]; - if (x1 != nay) { - setcolor(with.col); - line(x1, y1, x2, y2); - } - } - for (fv = 1; fv <= numlines; fv ++) { - fieldtype &with = fields[fv]; - if (with.x1 != nay) { - setcolor(fv); - rectangle(with.x1, with.y1, with.x2, with.y2); - } - } - for (fv = 1; fv <= 15; fv ++) drawped(fv); -} - -void addped() { - byte n, fv; - n = 0; - do { - n += 1; - } while (!((n == 16) || (peds[n].dir == 177))); - setcrtpagenumber(0); - setactivepage(0); - setvisualpage(0); - drawup(); - setgraphicscursor(tthand); - showmousecursor; - do { - if (rightmousekeypressed) return; - if (keypressed()) glimpse(0); - } while (!leftmousekeypressed); - hidemousecursor; - { - pedtype &with = peds[n]; - with.x = mousex; - with.y = mousey; - } - cleardevice(); - setfillstyle(6, 9); - for (fv = 1; fv <= 3; fv ++) bar(200 * fv, 0, 200 * fv, 200); - for (fv = 1; fv <= 2; fv ++) bar(0, 60 * fv, 640, 60 * fv); - showmousecursor; - do { - if (rightmousekeypressed) return; - } while (!leftmousekeypressed); - hidemousecursor; - { - pedtype &with = peds[n]; - switch (((mousex / 200) * 10) + (mousey / 60)) { - case 0: - with.dir = ul; - break; - case 10: - with.dir = up; - break; - case 20: - with.dir = ur; - break; - case 1: - with.dir = left; - break; - case 11: - with.dir = still; - break; - case 21: - with.dir = right; - break; - case 2: - with.dir = dl; - break; - case 12: - with.dir = down; - break; - case 22: - with.dir = dr; - break; - } - } -} - -void addline(byte ccc) { - byte fv; - do { - for (fv = 1; fv <= numlines; fv ++) { - linetype &with = lines[fv]; - if (x1 == nay) { - x1 = fv * 17; - x2 = x1; - y1 = 200; - y2 = 190; - with.col = ccc; - return; /* bad style! */ - } - } - } while (!false); -} - -byte colour() { - byte fv; - byte colour_result; - setactivepage(0); - setvisualpage(0); - setcrtpagenumber(0); - outtextxy(0, 0, "Select a colour, please..."); - for (fv = 1; fv <= 15; fv ++) { - setfillstyle(1, fv); - bar(fv * 40, 27, 39 + fv * 40, 200); - } - showmousecursor; - do { - if (rightmousekeypressed) { - hidemousecursor; - return colour_result; - } - if (keypressed()) glimpse(2); - } while (!leftmousekeypressed); - hidemousecursor; - colour_result = getpixel(mousex, mousey); - cleardevice(); - return colour_result; -} - -void addfield() { - byte fv; - boolean ok; - do { - fv = colour(); - ok = fields[fv].x1 == nay; - if (! ok) output << '\7'; - } while (!ok); - { - fieldtype &with = fields[fv]; - with.x1 = 300 + fv * 17; - with.x2 = with.x1 + 1; - with.y1 = 200; - with.y2 = 177; - } -} - -byte checkline() { - byte fv, ans; - byte checkline_result; - setgraphicscursor(crosshairs); - setcrtpagenumber(0); - setactivepage(0); - setvisualpage(0); - drawup(); - do { - showmousecursor; - do { - if (rightmousekeypressed) { - checkline_result = 255; - return checkline_result; - } - if (keypressed()) glimpse(0); - } while (!leftmousekeypressed); - hidemousecursor; - setactivepage(1); - ans = 177; - for (fv = 1; fv <= numlines; fv ++) { /* */ - { - linetype &with = lines[fv]; - if (x1 != nay) { - setcolor(9); - line(x1, y1, x2, y2); - if (getpixel(mousex, mousey) == 9) ans = fv; - setcolor(0); - line(x1, y1, x2, y2); - } - } - { - fieldtype &with = fields[fv]; - if (with.x1 != nay) { - setcolor(9); - rectangle(with.x1, with.y1, with.x2, with.y2); - if (getpixel(mousex, mousey) == 9) ans = fv + 100; - setcolor(0); - rectangle(with.x1, with.y1, with.x2, with.y2); - } - } - } - setactivepage(0); - } while (!(ans != 177)); - checkline_result = ans; - return checkline_result; -} - -void chooseside(); -static boolean itsaline; - -static void plotline() { - if (itsaline) { - linetype &with = lines[gd]; - if (do1) line(mousex, mousey, x2, y2); - else - line(x1, y1, mousex, mousey); - } else { - fieldtype &with = fields[gd]; - if (do1) rectangle(mousex, mousey, with.x2, with.y2); - else - rectangle(with.x1, with.y1, mousex, mousey); - } -} - -void chooseside() { - byte clicol, savelcol; - fieldtype current; - integer temp; - do { - gd = checkline(); - itsaline = gd < 100; - if (gd == 255) { - hidemousecursor; - return; - } - if (! itsaline) gd -= 100; - setactivepage(2); - setvisualpage(2); - cleardevice(); - setgraphicscursor(tthand); - setcrtpagenumber(2); - if (itsaline) { - current = lines[gd]; - savelcol = lines[gd].col; - } else current = fields[gd]; - { - setcolor(9); - if (itsaline) line(current.x1, current.y1, current.x2, current.y2); - else rectangle(current.x1, current.y1, current.x2, current.y2); - setcolor(9); - setfillstyle(1, red); - bar(current.x1 - 3, current.y1 - 3, current.x1 + 3, current.y1 + 3); - setfillstyle(1, green); - bar(current.x2 - 3, current.y2 - 3, current.x2 + 3, current.y2 + 3); - do { - } while (!(~ anymousekeypressed)); - clicol = 177; - showmousecursor; - do { - if (anymousekeypressed) { - hidemousecursor; - clicol = getpixel(mousex, mousey); - showmousecursor; - } - if (rightmousekeypressed) { - hidemousecursor; - return; - } - if (keypressed()) glimpse(2); - } while (!(set::of(red, green, eos).has(clicol))); - do1 = clicol == red; - hidemousecursor; - setgraphicscursor(hook); - setcrtpagenumber(0); - setactivepage(0); - setvisualpage(0); - setcolor(0); - if (itsaline) { - linetype &with1 = lines[gd]; ; - line(current.x1, current.y1, current.x2, current.y2); - setcolor(with1.col); - } else { - fieldtype &with1 = fields[gd]; ; - rectangle(with1.x1, with1.y1, with1.x2, with1.y2); - setcolor(gd); - } - setwritemode(xorput); - while (~ anymousekeypressed) { - plotline(); - showmousecursor; - delay(1); - hidemousecursor; - plotline(); - if (rightmousekeypressed) { - hidemousecursor; - return; - } - if (keypressed()) glimpse(0); - } - /* update "current" rec */ - if (do1) { - current.x1 = mousex; - current.y1 = mousey; - } else { - current.x2 = mousex; - current.y2 = mousey; - } - if (! itsaline) { - if (current.x1 > current.x2) { - temp = current.x2; - current.x2 = current.x1; - current.x1 = temp; - } - if (current.y1 > current.y2) { - temp = current.y2; - current.y2 = current.y1; - current.y1 = temp; - } - } - /* copy "current" to line/field */ - if (itsaline) { - linetype &with1 = lines[gd]; - current.x1 = current.x1; - current.x2 = current.x2; - current.y1 = current.y1; - current.y2 = current.y2; - with1.col = savelcol; - } else fields[gd] = current; - } - setwritemode(0); - } while (!false); -} - -void delped() { - setcrtpagenumber(0); - setactivepage(0); - setvisualpage(0); - drawup(); - setgraphicscursor(tthand); - showmousecursor; - do { - } while (!leftmousekeypressed); - peds[colour()].dir = 177; -} - -byte menu(); - -static void say(byte y, string x) { - setfillstyle(1, y); - bar(0, y * 17, 100, y * 17 + 15); - outtextxy(123, y * 17, x); -} - -byte menu() { - byte clicol; - byte menu_result; - setcolor(15); - settextstyle(0, 0, 2); - clicol = 0; - setgraphicscursor(tthand); - setvisualpage(2); - setactivepage(2); - setcrtpagenumber(2); - cleardevice(); - say(3, "Move lines around"); - say(4, "Add a new line"); - say(5, "Delete a line"); - say(6, "Add a ped"); - say(7, "Delete a ped"); - say(8, "Add a field"); - say(10, "Return to Also."); - showmousecursor; - do { - if (leftmousekeypressed) { - hidemousecursor; - clicol = getpixel(mousex, mousey); - showmousecursor; - } - if (rightmousekeypressed) { - hidemousecursor; - return menu_result; - } - if (keypressed()) glimpse(2); - } while (!(clicol > 0)); - do { - } while (!(~ anymousekeypressed)); - hidemousecursor; - menu_result = clicol; - return menu_result; -} - -void removeline() { - gd = checkline(); - if (gd == 255) { - hidemousecursor; - return; - } - if (gd > 100) - fields[gd - 100].x1 = nay; - else lines[gd].x1 = nay; /* cancels it out */ - cleardevice(); - drawup(); -} - -void lino() { - resetmouse; - do { - switch (menu()) { - case 3: - chooseside(); - break; - case 4: - addline(colour()); - break; - case 5: - removeline(); - break; - case 6: - addped(); - break; - case 7: - delped(); - break; - case 8: - addfield(); - break; - case 10: - return; - break; - } - } while (!false); -} - -void loadscreen() { /* load2 */ - byte a /*absolute $A000:246560*/; - byte bit; - untyped_file f; - setactivepage(3); - setvisualpage(3); - assign(f, string("c:\\avalot\\place") + n + ".avd"); - reset(f, 1); - seek(f, 177); - for (bit = 0; bit <= 3; bit ++) { - port[0x3c4] = 2; - port[0x3ce] = 4; - port[0x3c5] = 1 << bit; - port[0x3cf] = bit; - blockread(f, a, 12080); - } - close(f); - setvisualpage(0); - outtextxy(0, 190, "Look carefully, and then press any key..."); - setactivepage(0); -} - -void ctrlsout(string &x) { /* Replace real ctrls with caret codes */ - byte fv; - string xx; - xx = ""; - for (fv = 1; fv <= length(x); fv ++) - if (x[fv] > '\37') xx = xx + x[fv]; - else xx = xx + '^' + chr(ord(x[fv]) + 64); - x = xx; -} - -void ctrlsin(string &x) { /* Opposite of ctrlsout */ - byte fv; - string xx; - boolean ctrlwas; - xx = ""; - ctrlwas = false; - for (fv = 1; fv <= length(x); fv ++) - if (ctrlwas) { /* last char was a caret */ - xx = xx + chr(ord(upcase(x[fv])) - 64); - ctrlwas = false; - } else { - ; /* last char wasn't a caret... */ - if (x[fv] == '^') ctrlwas = true; - else /* ...but this one is */ - xx = xx + x[fv]; /* ...but this one isn't */ - } - x = xx; -} - -void flipover() { /* temp view other screen */ - char r; - setvisualpage(3); - r = readkey(); - setvisualpage(0); -} - -void plotchar(byte x, byte y, char n) { - byte fv; - if (chars[x][y] == n) return; - for (fv = 0; fv <= 15; fv ++) - mem[0xa000 * y * 1200 + (fv + 3) * 80 + x] = skinny[ord(n)][fv]; - chars[x][y] = n; -} - -void cursor() { - byte fv; - cursorflash += 1; - switch (cursorflash) { - case 1: - case 127: - for (fv = 12; fv <= 14; fv ++) - mem[0xa000 * ty * 1200 + (3 + fv) * 80 + tx] = ~(mem[0xa000 * ty * 1200 + (3 + fv) * 80 + tx]); - break; - case 255: - cursorflash = 0; - break; - } -} - -void losecursor() { - if (cursorflash < 127) { - cursorflash = 126; - cursor(); - } - cursorflash = 0; -} - -void gwrite(string x) { - byte fv; - for (fv = 1; fv <= length(x); fv ++) { - plotchar(tx, ty, x[fv]); - tx += 1; - if (tx == 80) { - ty += 1; - tx = 0; - } - } -} - -string typein(string x) { - const char marker = '\2'; - byte p; - char r; - string typein_result; - setvisualpage(0); - setactivepage(0); - cleardevice(); - settextstyle(0, 0, 1); - setcolor(15); - outtextxy(0, 0, "Press TAB to see the room..."); - outtextxy(0, 20, "You may use any of these Control Codes:"); - outtextxy(30, 30, "Anywhere: ^M = new line, ^P = new scroll, |1 fix to speaker 1."); - outtextxy(90, 40, "^B = new bubble"); - outtextxy(30, 50, "At end of line: ^C = centre line, ^L = left justify."); - outtextxy(30, 60, "At end of scroll: ^D = Don't add automatic ^P here."); - outtextxy(0, 80, "(Use by typing in (eg for ^P) ^ then P, not Ctrl-P.)"); - p = 0; - ctrlsout(x); - fillchar(chars, sizeof(chars), '\40'); - do { - tx = 0; - ty = 6; - gwrite(x + '\4' + '\40'); - tx = (p % 80); - ty = (p / 80) + 6; - while (! keypressed()) { - delay(1); - cursor(); - } - losecursor(); - r = readkey(); - switch (r) { - case '\10': - if (p > 0) { - x = copy(x, 1, p - 1) + copy(x, p + 1, 255); - p -= 1; - } - break; /* backspace */ - case '\11': - flipover(); - break; - case '\40' ... '\377': { - x = copy(x, 1, p) + r + copy(x, p + 1, 255); - p += 1; - } - break; - case '\0': - switch (readkey()) { /* extd. keystroke */ - case 'G': - p = 0; - break; /* Home */ - case 'K': - if (p > 0) p -= 1; - break; /* left */ - case 'M': - if (p < length(x)) p += 1; - break; /* right */ - case 'H': - if (p > 80) p -= 80; - break; /* up */ - case 'P': - if (p < length(x) - 80) p += 80; - break; /* down */ - case 'O': - p = length(x); - break; /* End */ - case 'S': - x = copy(x, 1, p) + copy(x, p + 2, 255); - break; /* Del */ - } - break; - } - } while (!(r == '\15')); - ctrlsin(x); - typein_result = x; - return typein_result; -} - -byte typeno(string title) { - varying_string<2> x; - char r; - integer e; - word p; - byte typeno_result; - cleardevice(); - x = "000"; - settextstyle(0, 0, 3); - setcolor(9); - outtextxy(0, 0, title); - setfillstyle(1, 0); - setcolor(10); - fillchar(chars, sizeof(chars), '\40'); - do { - bar(100, 100, 150, 125); - outtextxy(100, 100, x); - do { - r = readkey(); - } while (!(set::of(range('0', '9'), '\33', '\15', eos).has(r))); - if (r == '\33') { - typeno_result = 255; - return typeno_result; - } - if (r != '\15') x = string(x[2]) + r; - } while (!(r == '\15')); - val(x, p, e); - typeno_result = p; - return typeno_result; -} - -void showallnames() { - byte fv; - varying_string<2> s; - char r; - settextstyle(0, 0, 2); - cleardevice(); - setcolor(13); - outtextxy(0, 0, "Descriptions start..."); - settextstyle(0, 0, 1); - setcolor(7); - for (fv = 1; fv <= 29; fv ++) { - str(fv, 2, s); - outtextxy((fv / 15) * 320, ((fv % 15) * 10) + 30, s + '=' + copy(names[fv][1], 0, 33)); - } - setcolor(15); - outtextxy(500, 190, "Press any key..."); - r = readkey(); -} - -void showallassoc(); - - -static void saascreen() { - settextstyle(0, 0, 2); - cleardevice(); - setcolor(10); - outtextxy(0, 0, "Everything..."); - settextstyle(0, 0, 1); - setcolor(2); - outtextxy(17, 20, "(Format: <number> : <start of names> : <start of desc.>)"); -} - -void showallassoc() { - byte fv; - varying_string<2> s; - char r; - - saascreen(); - for (fv = 1; fv <= 30; fv ++) { - str(fv - 1, 2, s); - outtextxy(0, (((fv - 1) % 10) * 10) + 30, - s + ':' + copy(names[fv - 1][1], 1, 7) + ':' + copy(names[fv - 1][2], 1, 70)); - if ((fv % 10) == 0) { - r = readkey(); - saascreen(); - } - } - setcolor(15); - outtextxy(500, 190, "Press any key..."); - r = readkey(); -} - -void clear() { - byte fv; - fillchar(names , sizeof(names), '\0'); - for (fv = 1; fv <= numlines; fv ++) { - lines[fv].x1 = nay; - fields[fv].x1 = nay; - } - fillchar(peds , sizeof(peds), '\261'); -} - -void scramble(); - -static void scram1(string &x) { - byte fz; - for (fz = 1; fz <= length(x); fz ++) - x[fz] = chr(ord(x[fz]) ^ 177); -} - -void scramble() { /* Works both ways. */ - byte fv, ff; - for (fv = 0; fv <= 29; fv ++) - for (ff = 1; ff <= 2; ff ++) - scram1(names[fv][ff]); - scram1(listen); - scram1(flags); -} - -void save() { - string x; - untyped_file f; - byte minnames, minlines, minpeds, minfields, fv, ff; - minnames = 0; - for (fv = 0; fv <= 29; fv ++) if (names[fv][1] != "") minnames = fv; - minlines = 0; - for (fv = 1; fv <= numlines; fv ++) - if (lines[fv].x1 != nay) minlines = fv; - minpeds = 0; - for (fv = 1; fv <= 15; fv ++) if (peds[fv].dir < 177) minpeds = fv; - minfields = 0; - for (fv = 1; fv <= 30; fv ++) if (fields[fv].x1 != nay) minfields = fv; - assign(f, string("c:\\avalot\\also") + n + ".avd"); - rewrite(f, 1); - x = string("This is an Also .AVD file, which belongs to AVALOT.EXE. Its contents") + - '\15' + '\12' + "are subject to copyright, so there. Have fun!" + '\32' + " *Minstrel* "; - blockwrite(f, x[1], 128); - scramble(); - blockwrite(f, minnames, 1); - for (fv = 0; fv <= minnames; fv ++) - for (ff = 1; ff <= 2; ff ++) - blockwrite(f, names[fv][ff], length(names[fv][ff]) + 1); - blockwrite(f, minlines, 1); - blockwrite(f, lines, sizeof(lines[1])*minlines); - blockwrite(f, minpeds, 1); - blockwrite(f, peds, sizeof(peds[1])*minpeds); - blockwrite(f, minfields, 1); - blockwrite(f, fields, sizeof(fields[1])*minfields); - blockwrite(f, magics, sizeof(magics)); - blockwrite(f, portals, sizeof(portals)); - blockwrite(f, flags, sizeof(flags)); - blockwrite(f, listen[0], 1); - blockwrite(f, listen[1], length(listen)); - close(f); - scramble(); -} - -void load(); -static untyped_file f; - - -static string nextstring() { - byte l; - string x; - string nextstring_result; - x = ""; - blockread(f, l, 1); - blockread(f, x[1], l); - x[0] = chr(l); - nextstring_result = x; - return nextstring_result; -} - -void load() { - byte minnames, minlines, minpeds, minfields; - byte ff, fv; - - clear(); - assign(f, string("c:\\avalot\\also") + n + ".avd"); - /*$I-*/ reset(f, 1); /*$I+*/ if (ioresult != 0) return; /* no Also file */ - seek(f, 128); - blockread(f, minnames, 1); - for (fv = 0; fv <= minnames; fv ++) - for (ff = 1; ff <= 2; ff ++) - names[fv][ff] = nextstring(); - blockread(f, minlines, 1); - blockread(f, lines, sizeof(lines[1])*minlines); - blockread(f, minpeds, 1); - blockread(f, peds, sizeof(peds[1])*minpeds); - blockread(f, minfields, 1); - blockread(f, fields, sizeof(fields[1])*minfields); - blockread(f, magics, sizeof(magics)); - blockread(f, portals, sizeof(portals)); - blockread(f, flags, sizeof(flags)); - blockread(f, listen[0], 1); - blockread(f, listen[1], length(listen)); - close(f); - scramble(); -} - -void editmagics(); -const array<1, 15, char> codes = "123456789ABCDEF"; - -static integer y; - - -static void display() { - byte fv; - cleardevice(); - settextstyle(0, 0, 2); - setcolor(15); - outtextxy(0, 0, "Magics."); - settextstyle(0, 0, 1); - for (fv = 1; fv <= 15; fv ++) { - y = 23 + fv * 10; - setcolor(fv); - outtextxy(100, y, string('$') + codes[fv - 1]); - { - magictype &with = magics[fv]; - switch (with.op) { - case nix: { - setcolor(8); - outtextxy(140, y, "Nix"); - } - break; - case bounce: { - setcolor(10); - outtextxy(143, y, "Bounce!"); - } - break; - case exclaim: { - setcolor(14); - outtextxy(143, y, string("Exclaim: ") + strf(with.data)); - } - break; - case transport: { - setcolor(12); - outtextxy(143, y, string("Transport to ") + strf(hi(with.data)) + - ", ped " + strf(lo(with.data))); - } - break; - case unfinished: { - setcolor(15); - outtextxy(143, y, "*** UNFINISHED! ***"); - } - break; - case special: { - setcolor(6); - outtextxy(143, y, string("Special call no. ") + strf(with.data)); - } - break; - case opendoor: { - setcolor(11); - outtextxy(143, y, string("Opening door to ") + strf(hi(with.data)) + - ", ped " + strf(lo(with.data))); - } - break; - } - } - } - outtextxy(177, 190, "Which do you want to change\? (Esc=Exit) $"); -} - - - -static word ask(string x) { - string q; - word thomaswashere; - integer e; - word ask_result; - cleardevice(); - setcolor(10); - settextstyle(0, 0, 3); - outtextxy(0, 100, x); - do { - input >> q >> NL; - val(q, thomaswashere, e); - } while (!(e == 0)); - ask_result = thomaswashere; - return ask_result; -} - -void editmagics() { - char r, rr; - byte p; - - do { - display(); - do { - r = upcase(readkey()); - if (r == '\33') return; - p = pos(r, codes); /* which are we editing? */ - } while (!(p > 0)); /* it must BE there... */ - setcolor(p); - cleardevice(); - outtextxy(177, 17, string("Editing magic $") + r + '.'); - outtextxy(0, 30, "New operation ( (N)ix, (B)ounce, (E)xclaim, (T)ransport, (U)nfinished),"); - outtextxy(30, 40, "(S)pecial, (O)pening Door?"); - do { - rr = upcase(readkey()); - } while (!(set::of('N', 'B', 'E', 'T', 'U', 'S', 'O', '\33', eos).has(rr))); - { - magictype &with = magics[p]; - switch (rr) { - case '\33': - return; - break; /* cancelling code */ - case 'N': - with.op = nix; - break; - case 'B': - with.op = bounce; - break; - case 'E': { - with.op = exclaim; - with.data = ask("Which scroll?"); - } - break; - case 'T': { - with.op = transport; - with.data = ask("Ped no.?") + ask("Whither?") * 256; - } - break; - case 'U': - with.op = unfinished; - break; - case 'S': { - with.op = special; - with.data = ask("Which call?"); - } - break; - case 'O': { - with.op = opendoor; - with.data = ask("Ped no.?") + ask("Whither?") * 256; - } - break; - } - } - } while (!false); -} - -void editportals(); -const array<9, 15, char> codes1 = "9ABCDEF"; - -static integer y2; - - -static void display1() { - byte fv; - cleardevice(); - settextstyle(0, 0, 2); - setcolor(15); - outtextxy(0, 0, "Portals."); - settextstyle(0, 0, 1); - for (fv = 9; fv <= 15; fv ++) { - y2 = fv * 10 - 53; - setcolor(fv); - outtextxy(100, y2, string('$') + codes1[fv - 1]); - { - magictype &with = portals[fv]; - switch (with.op) { - case nix: { - setcolor(8); - outtextxy(140, y2, "Nix"); - } - break; - case exclaim: { - setcolor(14); - outtextxy(143, y2, string("Exclaim: ") + strf(with.data)); - } - break; - case transport: { - setcolor(12); - outtextxy(143, y2, string("Transport to ") + strf(hi(with.data)) + - ", ped " + strf(lo(with.data))); - } - break; - case unfinished: { - setcolor(15); - outtextxy(143, y2, "*** UNFINISHED! ***"); - } - break; - case special: { - setcolor(6); - outtextxy(143, y2, string("Special call no. ") + strf(with.data)); - } - break; - case opendoor: { - setcolor(11); - outtextxy(143, y2, string("Opening door to ") + strf(hi(with.data)) + - ", ped " + strf(lo(with.data))); - } - break; - } - } - } - outtextxy(177, 190, "Which do you want to change\? (Esc=Exit) $"); -} - - - -static word ask1(string x) { - string q; - word thomaswashere; - integer e; - word ask1_result; - cleardevice(); - setcolor(10); - settextstyle(0, 0, 3); - outtextxy(0, 100, x); - do { - input >> q >> NL; - val(q, thomaswashere, e); - } while (!(e == 0)); - ask1_result = thomaswashere; - return ask1_result; -} - -void editportals() { /* much t'same as editmagics */ - char r, rr; - byte p; - - do { - display1(); - do { - r = upcase(readkey()); - if (r == '\33') return; - p = pos(r, codes1); /* which are we editing? */ - } while (!(p > 0)); /* it must BE there... */ - p += 8; - setcolor(p); - cleardevice(); - outtextxy(177, 17, string("Editing portal $") + r + '.'); - outtextxy(0, 30, "New operation ( (N)ix, (E)xclaim, (T)ransport, (U)nfinished),"); - outtextxy(30, 40, "(S)pecial, (O)pening Door?"); - do { - rr = upcase(readkey()); - } while (!(set::of('N', 'E', 'T', 'U', 'S', 'O', '\33', eos).has(rr))); - { - magictype &with = portals[p]; - switch (rr) { - case '\33': - return; - break; /* cancelling code */ - case 'N': - with.op = nix; - break; - case 'E': { - with.op = exclaim; - with.data = ask1("Which scroll?"); - } - break; - case 'T': { - with.op = transport; - with.data = ask1("Ped no.?") + ask1("Whither?") * 256; - } - break; - case 'U': - with.op = unfinished; - break; - case 'S': { - with.op = special; - with.data = ask1("Which call?"); - } - break; - case 'O': { - with.op = opendoor; - with.data = ask1("Ped no.?") + ask1("Whither?") * 256; - } - break; - } - } - } while (!false); -} - -void editflags() { - char r; - cleardevice(); - settextstyle(0, 0, 2); - setcolor(15); - outtextxy(0, 0, "Flags."); - settextstyle(0, 0, 1); - setcolor(10); - outtextxy(100, 30, "Press the letter of the flag you want to toggle."); - outtextxy(100, 40, "Tab = flip screens, Esc/Enter = return to menu."); - setcolor(14); - setfillstyle(1, 0); - for (r = 'A'; r <= 'Z'; r ++) - if (pos(r, flags) > 0) outtextxy(ord(r) * 20 - 1223, 77, r); - do { - do { - r = upcase(readkey()); - } while (!(set::of(range('A', 'Z'), '\33', '\15', '\11', eos).has(r))); - switch (r) { - case RANGE_26('A', 'Z'): { - if (pos(r, flags) > 0) { - ; /* flag is on- switch it off */ - Delete(flags, pos(r, flags), 1); - bar(ord(r) * 20 - 1223, 77, ord(r) * 20 - 1213, 87); - sound(1777); - delay(7); - nosound; - } else { - ; /* flag is off- switch it on */ - flags = flags + r; - outtextxy(ord(r) * 20 - 1223, 77, r); - sound(177); - delay(7); - nosound; - } - } - break; - case '\33': - case '\15': - return; - break; - case '\11': - flipover(); - break; - } - } while (!false); -} - -void alsomenu() { - char r; - byte t; - do { - setactivepage(0); - setvisualpage(0); - cleardevice(); - setcolor(15); - settextstyle(0, 0, 2); - outtextxy(0, 0, "Also... Main Menu"); - settextstyle(0, 0, 1); - setcolor(10); - outtextxy(100, 40, "1) Edit the names of an object"); - outtextxy(100, 50, "2) View all names"); - outtextxy(100, 60, "3) Edit the description of this object"); - outtextxy(100, 70, "4) View all associations."); - outtextxy(100, 80, "5) Enter Lino mode."); - outtextxy(100, 90, "6) Edit magics."); - outtextxy(100, 100, "7) Edit portals."); - outtextxy(100, 110, "8) Edit flags."); - outtextxy(100, 120, "9) Edit listen field."); - outtextxy(100, 160, "S) Save"); - outtextxy(100, 170, "L) Load"); - outtextxy(80, 180, "Tab) View other screen"); - if (current == 0) outtextxy(0, 140, "< Main description of room >"); - else - outtextxy(0, 140, string('<') + names[current][1] + '>'); - do { - r = upcase(readkey()); - if (r == '\11') flipover(); - } while (!(set::of(range('1', '9'), 'S', 'L', '\0', eos).has(r))); - switch (r) { - case '1': { - do { - t = typeno("Which object\? (0-30)"); - } while (!((t < 30) || (t == 255))); - if ((t != 255) && (t != 0)) names[t][1] = typein(names[t][1]); - current = t; - } - break; - case '2': - showallnames(); - break; - case '3': - names[current][2] = typein(names[current][2]); - break; - case '4': - showallassoc(); - break; - case '5': - lino(); - break; - case '6': - editmagics(); - break; - case '7': - editportals(); - break; - case '8': - editflags(); - break; - case '9': - listen = typein(listen); - break; - case 'S': - save(); - break; - case 'L': - load(); - break; - case '\0': - if (readkey() == '\55') return; - break; - } - } while (!false); -} - -int main(int argc, const char *argv[]) { - pio_initialize(argc, argv); - output << "*** ALSO ***" << NL; - output << NL; - output << "No. of screen to edit?"; - input >> n >> NL; - load(); - assign(f, "v:avalot.fnt"); - reset(f); - f >> skinny; - close(f); - gd = 3; - gm = 0; - initgraph(gd, gm, "c:\\bp\\bgi"); - current = 0; - loadscreen(); - alsomenu(); - return EXIT_SUCCESS; -} - -} // End of namespace Avalanche.
\ No newline at end of file |