diff options
Diffstat (limited to 'engines/avalanche/dropdown.cpp')
-rw-r--r-- | engines/avalanche/dropdown.cpp | 1469 |
1 files changed, 822 insertions, 647 deletions
diff --git a/engines/avalanche/dropdown.cpp b/engines/avalanche/dropdown.cpp index 5637401259..0f3d078f12 100644 --- a/engines/avalanche/dropdown.cpp +++ b/engines/avalanche/dropdown.cpp @@ -11,7 +11,7 @@ * 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 + * 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 @@ -71,76 +71,108 @@ const integer disabled = darkgray; char r; byte fv; -void find_what_you_can_do_with_it() -{; - switch (thinks) { - case wine:case ink: verbstr=string(vb_exam)+vb_drink; break; - case bell: verbstr=string(vb_exam)+vb_ring; break; - case potion:case wine: verbstr=string(vb_exam)+vb_drink; break; - case chastity: verbstr=string(vb_exam)+vb_wear; break; - case lute: verbstr=string(vb_exam)+vb_play; break; - case mushroom:case onion: verbstr=string(vb_exam)+vb_eat; break; - case clothes: verbstr=string(vb_exam)+vb_wear; break; - default: verbstr=vb_exam; /* anything else */ - } -} - -void chalk(integer x,integer y, char t, string z, boolean valid) -{ - byte fv,ff,p,bit; - word pageseg; - byte ander; -; - - pageseg=0xa000+cp*0x400; - - if (valid) ander=255; else ander=170; - - for( fv=1; fv <= length(z); fv ++) - for( ff=0; ff <= 7; ff ++) - for( bit=0; bit <= 2; bit ++) - {; - port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; - mem[pageseg*x+fv-1+(y+ff)*80]=~ (little[z[fv]][ff] & ander); - } - - for( ff=0; ff <= 8; ff ++) - {; - port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << 3; port[0x3cf]=3; - fillchar(mem[pageseg*x+(y+ff)*80],length(z),'\0'); /* blank it out. */ - } - - p=pos(t,z); if (p==0) return; p -= 1; - - for( bit=0; bit <= 2; bit ++) - {; - port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; - mem[pageseg*x+p+(y+8)*80]=~ ander; - } +void find_what_you_can_do_with_it() { + ; + switch (thinks) { + case wine: + case ink: + verbstr = string(vb_exam) + vb_drink; + break; + case bell: + verbstr = string(vb_exam) + vb_ring; + break; + case potion: + case wine: + verbstr = string(vb_exam) + vb_drink; + break; + case chastity: + verbstr = string(vb_exam) + vb_wear; + break; + case lute: + verbstr = string(vb_exam) + vb_play; + break; + case mushroom: + case onion: + verbstr = string(vb_exam) + vb_eat; + break; + case clothes: + verbstr = string(vb_exam) + vb_wear; + break; + default: + verbstr = vb_exam; /* anything else */ + } +} - blitfix(); +void chalk(integer x, integer y, char t, string z, boolean valid) { + byte fv, ff, p, bit; + word pageseg; + byte ander; + ; + + pageseg = 0xa000 + cp * 0x400; + + if (valid) ander = 255; + else ander = 170; + + for (fv = 1; fv <= length(z); fv ++) + for (ff = 0; ff <= 7; ff ++) + for (bit = 0; bit <= 2; bit ++) { + ; + port[0x3c4] = 2; + port[0x3ce] = 4; + port[0x3c5] = 1 << bit; + port[0x3cf] = bit; + mem[pageseg * x + fv - 1 + (y + ff) * 80] = ~(little[z[fv]][ff] & ander); + } + + for (ff = 0; ff <= 8; ff ++) { + ; + port[0x3c4] = 2; + port[0x3ce] = 4; + port[0x3c5] = 1 << 3; + port[0x3cf] = 3; + fillchar(mem[pageseg * x + (y + ff) * 80], length(z), '\0'); /* blank it out. */ + } + + p = pos(t, z); + if (p == 0) return; + p -= 1; + + for (bit = 0; bit <= 2; bit ++) { + ; + port[0x3c4] = 2; + port[0x3ce] = 4; + port[0x3c5] = 1 << bit; + port[0x3cf] = bit; + mem[pageseg * x + p + (y + 8) * 80] = ~ ander; + } + + blitfix(); } -void hlchalk(integer x,integer y, char t, string z, boolean valid) - /* Highlighted. */ +void hlchalk(integer x, integer y, char t, string z, boolean valid) +/* Highlighted. */ { - byte fv,ff,p; - word pageseg; - byte ander; -; + byte fv, ff, p; + word pageseg; + byte ander; + ; - pageseg=0xa000+cp*0x400; + pageseg = 0xa000 + cp * 0x400; - if (valid) ander=255; else ander=170; + if (valid) ander = 255; + else ander = 170; - for( fv=1; fv <= length(z); fv ++) - for( ff=0; ff <= 7; ff ++) - mem[pageseg*x+fv-1+(y+ff)*80]=little[z[fv]][ff] & ander; + for (fv = 1; fv <= length(z); fv ++) + for (ff = 0; ff <= 7; ff ++) + mem[pageseg * x + fv - 1 + (y + ff) * 80] = little[z[fv]][ff] & ander; - p=pos(t,z); if (p==0) return; p -= 1; + p = pos(t, z); + if (p == 0) return; + p -= 1; - mem[pageseg*x+p+(y+8)*80]=ander; - blitfix(); + mem[pageseg * x + p + (y + 8) * 80] = ander; + blitfix(); } /*procedure say(x,y:integer; t:char; z:string; f,b:byte); @@ -150,475 +182,539 @@ begin; chalk(x,y,t,z); end;*/ -void bleep() -{; - sound(177); delay(7); nosound; +void bleep() { + ; + sound(177); + delay(7); + nosound; } -void onemenu::start_afresh() -{; - number=0; width=0; firstlix=false; oldy=0; highlightnum=0; +void onemenu::start_afresh() { + ; + number = 0; + width = 0; + firstlix = false; + oldy = 0; + highlightnum = 0; } -onemenu* onemenu::init() -{; - menunow=false; ddmnow=false; menunum=1; - return this; +onemenu *onemenu::init() { + ; + menunow = false; + ddmnow = false; + menunum = 1; + return this; } -void onemenu::opt(string n, char tr, string key, boolean val) -{ - integer l; -; - number += 1; - l=length(n+key)+3; if (width<l) width=l; - { - optiontype& with = oo[number]; - ; - with.title=n; - with.trigger=tr; - with.shortcut=key; - with.valid=val; - } -} - -void onemenu::displayopt(byte y, boolean highlit) -{ - string data; -; - { - optiontype& with = oo[y]; - ; +void onemenu::opt(string n, char tr, string key, boolean val) { + integer l; + ; + number += 1; + l = length(n + key) + 3; + if (width < l) width = l; + { + optiontype &with = oo[number]; + ; + with.title = n; + with.trigger = tr; + with.shortcut = key; + with.valid = val; + } +} + +void onemenu::displayopt(byte y, boolean highlit) { + string data; + ; + { + optiontype &with = oo[y]; + ; - if (highlit) - setfillstyle(1,0); - else - setfillstyle(1,7); - bar((flx1+1)*8,3+y*10,(flx2+1)*8,12+y*10); + if (highlit) + setfillstyle(1, 0); + else + setfillstyle(1, 7); + bar((flx1 + 1) * 8, 3 + y * 10, (flx2 + 1) * 8, 12 + y * 10); -/* settextjustify(2,2); - if shortcut>'' then outtextxy(flx2,4+y*10,shortcut);*/ + /* settextjustify(2,2); + if shortcut>'' then outtextxy(flx2,4+y*10,shortcut);*/ - data=with.title; + data = with.title; - while (length(data+with.shortcut)<width) - data=data+' '; /* Pad with spaces. */ + while (length(data + with.shortcut) < width) + data = data + ' '; /* Pad with spaces. */ - data=data+with.shortcut; + data = data + with.shortcut; - if (highlit) - hlchalk(left,4+y*10,with.trigger,data,with.valid); - else - chalk(left,4+y*10,with.trigger,data,with.valid); + if (highlit) + hlchalk(left, 4 + y * 10, with.trigger, data, with.valid); + else + chalk(left, 4 + y * 10, with.trigger, data, with.valid); - } + } } -void onemenu::display() -{ - byte y; -; - off(); - setactivepage(cp); setvisualpage(cp); - setfillstyle(1,menu_b); setcolor(menu_border); - firstlix=true; - flx1=left-2; flx2=left+width; fly=14+number*10; - menunow=true; ddmnow=true; +void onemenu::display() { + byte y; + ; + off(); + setactivepage(cp); + setvisualpage(cp); + setfillstyle(1, menu_b); + setcolor(menu_border); + firstlix = true; + flx1 = left - 2; + flx2 = left + width; + fly = 14 + number * 10; + menunow = true; + ddmnow = true; + + bar((flx1 + 1) * 8, 12, (flx2 + 1) * 8, fly); + rectangle((flx1 + 1) * 8 - 1, 11, (flx2 + 1) * 8 + 1, fly + 1); + + displayopt(1, true); + for (y = 2; y <= number; y ++) { + optiontype &with = oo[y]; + displayopt(y, false); + } + defaultled = 1; + cmp = 177; + mousepage(cp); + on(); /* 4= fletch */ +} - bar((flx1+1)*8,12,(flx2+1)*8,fly); - rectangle((flx1+1)*8-1,11,(flx2+1)*8+1,fly+1); +void onemenu::wipe() { + bytefield r; + ; + setactivepage(cp); + off(); + { + headtype &with = ddm_m.ddms[ddm_o.menunum]; + chalk(with.xpos, 1, with.trigger, with.title, true); + } + /* mblit((flx1-3) div 8,11,((flx2+1) div 8)+1,fly+1,3,cp);*/ + + /* with r do + begin; + x1:=flx1; + y1:=11; + x2:=flx2+1; + y2:=fly+1; + end; + getset[cp].remember(r);*/ + + mblit(flx1, 11, flx2 + 1, fly + 1, 3, cp); + blitfix(); + menunow = false; + ddmnow = false; + firstlix = false; + defaultled = 2; + on_virtual(); +} - displayopt(1,true); - for( y=2; y <= number; y ++) - { optiontype& with = oo[y]; displayopt(y,false);} - defaultled=1; cmp=177; mousepage(cp); on(); /* 4= fletch */ +void onemenu::movehighlight(shortint add) { + shortint hn; + ; + if (add != 0) { + ; + hn = highlightnum + add; + if ((hn < 0) || (hn >= (unsigned char)number)) return; + highlightnum = hn; + } + setactivepage(cp); + off(); + displayopt(oldy + 1, false); + displayopt(highlightnum + 1, true); + setactivepage(1 - cp); + oldy = highlightnum; + on(); } -void onemenu::wipe() -{ - bytefield r; -; - setactivepage(cp); - off(); - { headtype& with = ddm_m.ddms[ddm_o.menunum]; - chalk(with.xpos,1,with.trigger,with.title,true);} -/* mblit((flx1-3) div 8,11,((flx2+1) div 8)+1,fly+1,3,cp);*/ - -/* with r do - begin; - x1:=flx1; - y1:=11; - x2:=flx2+1; - y2:=fly+1; - end; - getset[cp].remember(r);*/ +void onemenu::lightup() { /* This makes the menu highlight follow the mouse.*/ + ; + if ((mx < (cardinal)flx1 * 8) || (mx > (cardinal)flx2 * 8) || (my <= 12) || (my > (cardinal)fly - 3)) return; + highlightnum = (my - 13) / 10; + if (highlightnum == oldy) return; + movehighlight(0); +} + +void onemenu::select(byte n) { /* Choose which one you want. */ + ; + if (! oo[n + 1].valid) return; + choicenum = n; + wipe(); - mblit(flx1,11,flx2+1,fly+1,3,cp); blitfix(); - menunow=false; ddmnow=false; firstlix=false; defaultled=2; - on_virtual(); + if (choicenum == number) choicenum -= 1; /* Off the bottom. */ + if (choicenum > number) choicenum = 0; /* Off the top, I suppose. */ + + ddm_m.ddms[menunum].do_choose(); } -void onemenu::movehighlight(shortint add) -{ - shortint hn; -; - if (add!=0) - {; - hn=highlightnum+add; - if ((hn<0) || (hn>=(unsigned char)number)) return; - highlightnum=hn; - } - setactivepage(cp); off(); - displayopt(oldy+1,false); - displayopt(highlightnum+1,true); - setactivepage(1-cp); - oldy=highlightnum; on(); +void onemenu::keystroke(char c) { + byte fv; + boolean found; + ; + c = upcase(c); + found = false; + for (fv = 1; fv <= number; fv ++) { + optiontype &with = oo[fv]; + if ((upcase(with.trigger) == c) && with.valid) { + ; + select(fv - 1); + found = true; + } + } + if (! found) blip(); } -void onemenu::lightup() /* This makes the menu highlight follow the mouse.*/ -{; - if ((mx<(cardinal)flx1*8) || (mx>(cardinal)flx2*8) || (my<=12) || (my>(cardinal)fly-3)) return; - highlightnum=(my-13) / 10; - if (highlightnum==oldy) return; - movehighlight(0); +headtype *headtype::init +(char trig, char alttrig, string name, byte p, proc dw, proc dc) { + ; + trigger = trig; + alttrigger = alttrig; + title = name; + position = p; + xpos = (position - 1) * spacing + indent; + xright = position * spacing + indent; + do_setup = dw; + do_choose = dc; + return this; } -void onemenu::select(byte n) /* Choose which one you want. */ -{; - if (! oo[n+1].valid) return; - choicenum=n; wipe(); +void headtype::display() { + ; + off(); /*MT*/ + chalk(xpos, 1, trigger, title, true); + on(); /*MT*/ +} - if (choicenum==number) choicenum -= 1; /* Off the bottom. */ - if (choicenum>number) choicenum=0; /* Off the top, I suppose. */ +void headtype::highlight() { + ; + off(); + off_virtual(); + nosound; + setactivepage(cp); + hlchalk(xpos, 1, trigger, title, true); + { + ; + ddm_o.left = xpos; + ddm_o.menunow = true; + ddmnow = true; + ddm_o.menunum = position; + } + cmp = 177; /* Force redraw of cursor. */ +} - ddm_m.ddms[menunum].do_choose(); +boolean headtype::extdparse(char c) { + boolean extdparse_result; + ; + if (c != alttrigger) { + ; + extdparse_result = true; + return extdparse_result; + } + extdparse_result = false; + return extdparse_result; } -void onemenu::keystroke(char c) -{ - byte fv; boolean found; -; - c=upcase(c); found=false; - for( fv=1; fv <= number; fv ++) - { optiontype& with = oo[fv]; - if ((upcase(with.trigger)==c) && with.valid) - {; - select(fv-1); - found=true; - }} - if (! found) blip(); -} - - headtype* headtype::init - (char trig,char alttrig, string name, byte p, proc dw,proc dc) - {; - trigger=trig; alttrigger=alttrig; title=name; - position=p; xpos=(position-1)*spacing+indent; - xright=position*spacing+indent; - do_setup=dw; do_choose=dc; - return this; - } - - void headtype::display() - {; - off(); /*MT*/ - chalk(xpos,1,trigger,title,true); - on(); /*MT*/ - } - - void headtype::highlight() - {; - off(); off_virtual(); nosound; - setactivepage(cp); - hlchalk(xpos,1,trigger,title,true); - {; - ddm_o.left=xpos; - ddm_o.menunow=true; ddmnow=true; ddm_o.menunum=position; - } - cmp=177; /* Force redraw of cursor. */ - } - - boolean headtype::extdparse(char c) - {boolean extdparse_result; - ; - if (c!=alttrigger) {; extdparse_result=true; return extdparse_result; } - extdparse_result=false; - return extdparse_result; - } - - menuset* menuset::init() - {; - howmany=0; - return this; - } - - void menuset::create(char t, string n, char alttrig, proc dw,proc dc) - {; - howmany += 1; - ddms[howmany].init(t,alttrig,n,howmany,dw,dc); - } - - void menuset::update() - { - const bytefield menuspace = {0, 0, 80, 9}; - byte fv,page_,savecp; - ; - setactivepage(3); - setfillstyle(1,menu_b); bar(0, 0,640, 9); - savecp=cp; cp=3; - - for( fv=1; fv <= howmany; fv ++) - ddms[fv].display(); - - for( page_=0; page_ <= 1; page_ ++) - getset[page_].remember(menuspace); - - cp=savecp; - } - - void menuset::extd(char c) - { - byte fv; - ; - fv=1; - while ((fv<=howmany) && (ddms[fv].extdparse(c))) fv += 1; - if (fv>howmany) return; getcertain(fv); - } - - void menuset::getcertain(byte fv) - {; - { headtype& with = ddms[fv]; - {; - if (ddm_o.menunow) - {; - wipe(); /* get rid of menu */ - if (ddm_o.menunum==with.position) return; /* clicked on own highlight */ - } - highlight(); do_setup(); - }} - } - - void menuset::getmenu(integer x) - { - byte fv; - ; - fv=0; - do { - fv += 1; - if ((x>ddms[fv].xpos*8) && (x<ddms[fv].xright*8)) - {; - getcertain(fv); - return; - } - } while (!(fv>howmany)); - } - -void parsekey(char r,char re) -{; - switch (r) { - case '\0':case '\340': {; - switch (re) { - case 'K': if (ddm_o.menunum>1) {; - wipe(); - ddm_m.getcertain(ddm_o.menunum-1); - } else - {; /* Get menu on the left-hand side */ - wipe(); - ddm_m.getmenu((ddm_m.howmany-1)*spacing+indent); - } - break; - case 'M': if (ddm_o.menunum<ddm_m.howmany) {; - wipe(); - ddm_m.getcertain(ddm_o.menunum+1); - } else - {; /* Get menu on the far right-hand side */ - wipe(); - ddm_m.getmenu(indent); - } - break; - case 'H': movehighlight(-1); break; - case 'P': movehighlight(1); break; - default: ddm_m.extd(re); - } - } - break; - case '\15': select(ddm_o.highlightnum); break; - default: - {; - if (ddm_o.menunow) keystroke(r); - } - } +menuset *menuset::init() { + ; + howmany = 0; + return this; +} + +void menuset::create(char t, string n, char alttrig, proc dw, proc dc) { + ; + howmany += 1; + ddms[howmany].init(t, alttrig, n, howmany, dw, dc); +} + +void menuset::update() { + const bytefield menuspace = {0, 0, 80, 9}; + byte fv, page_, savecp; + ; + setactivepage(3); + setfillstyle(1, menu_b); + bar(0, 0, 640, 9); + savecp = cp; + cp = 3; + + for (fv = 1; fv <= howmany; fv ++) + ddms[fv].display(); + + for (page_ = 0; page_ <= 1; page_ ++) + getset[page_].remember(menuspace); + + cp = savecp; +} + +void menuset::extd(char c) { + byte fv; + ; + fv = 1; + while ((fv <= howmany) && (ddms[fv].extdparse(c))) fv += 1; + if (fv > howmany) return; + getcertain(fv); +} + +void menuset::getcertain(byte fv) { + ; + { + headtype &with = ddms[fv]; + { + ; + if (ddm_o.menunow) { + ; + wipe(); /* get rid of menu */ + if (ddm_o.menunum == with.position) return; /* clicked on own highlight */ + } + highlight(); + do_setup(); + } + } +} + +void menuset::getmenu(integer x) { + byte fv; + ; + fv = 0; + do { + fv += 1; + if ((x > ddms[fv].xpos * 8) && (x < ddms[fv].xright * 8)) { + ; + getcertain(fv); + return; + } + } while (!(fv > howmany)); +} + +void parsekey(char r, char re) { + ; + switch (r) { + case '\0': + case '\340': { + ; + switch (re) { + case 'K': + if (ddm_o.menunum > 1) { + ; + wipe(); + ddm_m.getcertain(ddm_o.menunum - 1); + } else { + ; /* Get menu on the left-hand side */ + wipe(); + ddm_m.getmenu((ddm_m.howmany - 1)*spacing + indent); + } + break; + case 'M': + if (ddm_o.menunum < ddm_m.howmany) { + ; + wipe(); + ddm_m.getcertain(ddm_o.menunum + 1); + } else { + ; /* Get menu on the far right-hand side */ + wipe(); + ddm_m.getmenu(indent); + } + break; + case 'H': + movehighlight(-1); + break; + case 'P': + movehighlight(1); + break; + default: + ddm_m.extd(re); + } + } + break; + case '\15': + select(ddm_o.highlightnum); + break; + default: { + ; + if (ddm_o.menunow) keystroke(r); + } + } } /*$F+ *** Here follow all the ddm__ and do__ procedures for the DDM system. */ -void ddm__game() -{; - {; - start_afresh(); - opt("Help...",'H',"f1",true); - opt("Boss Key",'B',"alt-B",true); - opt("Untrash screen",'U',"ctrl-f7",true); - opt("Score and rank",'S',"f9",true); - opt("About Avvy...",'A',"shift-f10",true); - display(); - } -} - -void ddm__file() -{; - {; - start_afresh(); - opt("New game",'N',"f4",true); - opt("Load...",'L',"^f3",true); - opt("Save",'S',"^f2",alive); - opt("Save As...",'v',"",alive); - opt("DOS Shell",'D',atkey+'1',true); - opt("Quit",'Q',"alt-X",true); - display(); - } -} - -void ddm__action() -{ - string n; -; - n=copy(f5_does(),2,255); - - {; - start_afresh(); - if (n=="") - opt("Do something",'D',"f5",false); - else - opt(copy(n,2,255),n[1],"f5",true); - opt("Pause game",'P',"f6",true); - if (dna.room==99) - opt("Journey thither",'J',"f7",neardoor()); - else - opt("Open the door",'O',"f7",neardoor()); - opt("Look around",'L',"f8",true); - opt("Inventory",'I',"Tab",true); - if (tr[1].xs==walk) - opt("Run fast",'R',"^R",true); - else - opt("Walk slowly",'W',"^W",true); - display(); - } -} - -void ddm__people() -{ - byte here; char fv; -; +void ddm__game() { + ; + { + ; + start_afresh(); + opt("Help...", 'H', "f1", true); + opt("Boss Key", 'B', "alt-B", true); + opt("Untrash screen", 'U', "ctrl-f7", true); + opt("Score and rank", 'S', "f9", true); + opt("About Avvy...", 'A', "shift-f10", true); + display(); + } +} - people=""; - here=dna.room; +void ddm__file() { + ; + { + ; + start_afresh(); + opt("New game", 'N', "f4", true); + opt("Load...", 'L', "^f3", true); + opt("Save", 'S', "^f2", alive); + opt("Save As...", 'v', "", alive); + opt("DOS Shell", 'D', atkey + '1', true); + opt("Quit", 'Q', "alt-X", true); + display(); + } +} - {; - start_afresh(); - for( fv='\226'; fv <= '\262'; fv ++) - if (whereis[fv]==here) - {; - opt(getname(fv),getnamechar(fv),"",true); - people=people+fv; - } - display(); - } +void ddm__action() { + string n; + ; + n = copy(f5_does(), 2, 255); + + { + ; + start_afresh(); + if (n == "") + opt("Do something", 'D', "f5", false); + else + opt(copy(n, 2, 255), n[1], "f5", true); + opt("Pause game", 'P', "f6", true); + if (dna.room == 99) + opt("Journey thither", 'J', "f7", neardoor()); + else + opt("Open the door", 'O', "f7", neardoor()); + opt("Look around", 'L', "f8", true); + opt("Inventory", 'I', "Tab", true); + if (tr[1].xs == walk) + opt("Run fast", 'R', "^R", true); + else + opt("Walk slowly", 'W', "^W", true); + display(); + } } -void ddm__objects() -{ - char fv; -; - {; - start_afresh(); - for( fv='\1'; fv <= numobjs; fv ++) - if (dna.obj[fv]) - opt(get_thing(fv),get_thingchar(fv),"",true); - display(); - } +void ddm__people() { + byte here; + char fv; + ; + + people = ""; + here = dna.room; + + { + ; + start_afresh(); + for (fv = '\226'; fv <= '\262'; fv ++) + if (whereis[fv] == here) { + ; + opt(getname(fv), getnamechar(fv), "", true); + people = people + fv; + } + display(); + } } -string himher(char x) /* Returns "im" for boys, and "er" for girls.*/ -{string himher_result; -; - if (x<'\257') himher_result="im"; else himher_result="er"; -return himher_result; +void ddm__objects() { + char fv; + ; + { + ; + start_afresh(); + for (fv = '\1'; fv <= numobjs; fv ++) + if (dna.obj[fv]) + opt(get_thing(fv), get_thingchar(fv), "", true); + display(); + } } -void ddm__with() -{ - byte fv; varying_string<7> verb; char vbchar; boolean n; -; - {; - start_afresh(); - - if (thinkthing) - {; - - find_what_you_can_do_with_it(); - - for( fv=1; fv <= length(verbstr); fv ++) - {; - verbopt(verbstr[fv],verb,vbchar); - opt(verb,vbchar,"",true); - } - - /* We disable the "give" option if: (a), you haven't selected anybody, - (b), the person you've selected isn't in the room, - or (c), the person you've selected is YOU! */ - - if ((set::of(nowt,pavalot, eos).has(last_person)) || - (whereis[last_person]!=dna.room)) - opt("Give to...",'G',"",false); /* Not here. */ else - {; - opt(string("Give to ")+getname(last_person),'G',"",true); - verbstr=verbstr+vb_give; - } - - } else - {; - opt("Examine",'x',"",true); - opt(string("Talk to h")+himher(thinks),'T',"",true); - verbstr=string(vb_exam)+vb_talk; - switch (thinks) { - - case pgeida:case parkata: - {; - opt("Kiss her",'K',"",true); - verbstr=verbstr+vb_kiss; - } - break; - - case pdogfood: - {; - opt("Play his game",'P',"",! dna.wonnim); /* True if you HAVEN'T won. */ - verbstr=verbstr+vb_play; - } - break; - - case pmalagauche: - {; - n=! dna.teetotal; - opt("Buy some wine",'w',"",! dna.obj[wine]); - opt("Buy some beer",'b',"",n); - opt("Buy some whisky",'h',"",n); opt("Buy some cider",'c',"",n); - opt("Buy some mead",'m',"",n); - verbstr=verbstr+'\145'+'\144'+'\146'+'\147'+'\150'; - } - break; - - case ptrader: - {; - opt("Buy an onion",'o',"",! dna.obj[onion]); - verbstr=verbstr+'\151'; - } - break; - - } - } - display(); - } +string himher(char x) { /* Returns "im" for boys, and "er" for girls.*/ + string himher_result; + ; + if (x < '\257') himher_result = "im"; + else himher_result = "er"; + return himher_result; +} + +void ddm__with() { + byte fv; + varying_string<7> verb; + char vbchar; + boolean n; + ; + { + ; + start_afresh(); + + if (thinkthing) { + ; + + find_what_you_can_do_with_it(); + + for (fv = 1; fv <= length(verbstr); fv ++) { + ; + verbopt(verbstr[fv], verb, vbchar); + opt(verb, vbchar, "", true); + } + + /* We disable the "give" option if: (a), you haven't selected anybody, + (b), the person you've selected isn't in the room, + or (c), the person you've selected is YOU! */ + + if ((set::of(nowt, pavalot, eos).has(last_person)) || + (whereis[last_person] != dna.room)) + opt("Give to...", 'G', "", false); /* Not here. */ else { + ; + opt(string("Give to ") + getname(last_person), 'G', "", true); + verbstr = verbstr + vb_give; + } + + } else { + ; + opt("Examine", 'x', "", true); + opt(string("Talk to h") + himher(thinks), 'T', "", true); + verbstr = string(vb_exam) + vb_talk; + switch (thinks) { + + case pgeida: + case parkata: { + ; + opt("Kiss her", 'K', "", true); + verbstr = verbstr + vb_kiss; + } + break; + + case pdogfood: { + ; + opt("Play his game", 'P', "", ! dna.wonnim); /* True if you HAVEN'T won. */ + verbstr = verbstr + vb_play; + } + break; + + case pmalagauche: { + ; + n = ! dna.teetotal; + opt("Buy some wine", 'w', "", ! dna.obj[wine]); + opt("Buy some beer", 'b', "", n); + opt("Buy some whisky", 'h', "", n); + opt("Buy some cider", 'c', "", n); + opt("Buy some mead", 'm', "", n); + verbstr = verbstr + '\145' + '\144' + '\146' + '\147' + '\150'; + } + break; + + case ptrader: { + ; + opt("Buy an onion", 'o', "", ! dna.obj[onion]); + verbstr = verbstr + '\151'; + } + break; + + } + } + display(); + } } /*procedure ddm__map; @@ -647,113 +743,188 @@ begin; end; end;*/ -void do__game() -{; - switch (ddm_o.choicenum) { - /* Help, boss, untrash screen. */ - case 0: callverb(vb_help); break; - case 1: callverb(vb_boss); break; - case 2: major_redraw(); break; - case 3: callverb(vb_score); break; - case 4: callverb(vb_info); break; - } -} - -void do__file() -{; - switch (ddm_o.choicenum) { - /* New game, load, save, save as, DOS shell, about, quit. */ - case 0: callverb(vb_restart); break; - case 1: {; realwords[2]=""; callverb(vb_load); } break; - case 2: {; realwords[2]=""; callverb(vb_save); } break; - case 3: filename_edit(); break; - case 4: back_to_bootstrap(2); break; - case 5: callverb(vb_quit); break; - } -} - -void do__action() -{ - string n; -; - switch (ddm_o.choicenum) { - /* Get up/pause game/open door/look/inv/walk-run */ - case 0: { - person=pardon; thing=pardon; - n=f5_does(); callverb(n[1]); - } - break; - case 1: callverb(vb_pause); break; - case 2: callverb(vb_open); break; - case 3: callverb(vb_look); break; - case 4: callverb(vb_inv); break; - case 5: { - if (tr[1].xs==walk) tr[1].xs=run; - else tr[1].xs=walk; - newspeed(); - } - break; - } -} - -void do__objects() -{; - thinkabout(objlist[ddm_o.choicenum+1],a_thing); -} - -void do__people() -{; - thinkabout(people[ddm_o.choicenum+1],a_person); - last_person=people[ddm_o.choicenum+1]; -} - -void do__with() -{; - thing=thinks; - - if (thinkthing) - {; - - thing += 49; - - if (verbstr[ddm_o.choicenum+1]==vb_give) - person=last_person; - else - person='\376'; - - } else - {; - switch (verbstr[ddm_o.choicenum+1]) { - case '\144': {; thing='\144'; callverb(vb_buy); return; } break; /* Beer */ - case '\145': {; thing= '\62'; callverb(vb_buy); return; } break; /* Wine */ - case '\146': {; thing='\146'; callverb(vb_buy); return; } break; /* Whisky */ - case '\147': {; thing='\147'; callverb(vb_buy); return; } break; /* Cider */ - case '\150': {; thing='\153'; callverb(vb_buy); return; } break; /* Mead */ - case '\151': {; thing= '\103'; callverb(vb_buy); return; } break; /* Onion (trader) */ - default: - {; - person=thing; - thing='\376'; - } - } - } - callverb(verbstr[ddm_o.choicenum+1]); +void do__game() { + ; + switch (ddm_o.choicenum) { + /* Help, boss, untrash screen. */ + case 0: + callverb(vb_help); + break; + case 1: + callverb(vb_boss); + break; + case 2: + major_redraw(); + break; + case 3: + callverb(vb_score); + break; + case 4: + callverb(vb_info); + break; + } +} + +void do__file() { + ; + switch (ddm_o.choicenum) { + /* New game, load, save, save as, DOS shell, about, quit. */ + case 0: + callverb(vb_restart); + break; + case 1: { + ; + realwords[2] = ""; + callverb(vb_load); + } + break; + case 2: { + ; + realwords[2] = ""; + callverb(vb_save); + } + break; + case 3: + filename_edit(); + break; + case 4: + back_to_bootstrap(2); + break; + case 5: + callverb(vb_quit); + break; + } +} + +void do__action() { + string n; + ; + switch (ddm_o.choicenum) { + /* Get up/pause game/open door/look/inv/walk-run */ + case 0: { + person = pardon; + thing = pardon; + n = f5_does(); + callverb(n[1]); + } + break; + case 1: + callverb(vb_pause); + break; + case 2: + callverb(vb_open); + break; + case 3: + callverb(vb_look); + break; + case 4: + callverb(vb_inv); + break; + case 5: { + if (tr[1].xs == walk) tr[1].xs = run; + else tr[1].xs = walk; + newspeed(); + } + break; + } +} + +void do__objects() { + ; + thinkabout(objlist[ddm_o.choicenum + 1], a_thing); +} + +void do__people() { + ; + thinkabout(people[ddm_o.choicenum + 1], a_person); + last_person = people[ddm_o.choicenum + 1]; +} + +void do__with() { + ; + thing = thinks; + + if (thinkthing) { + ; + + thing += 49; + + if (verbstr[ddm_o.choicenum + 1] == vb_give) + person = last_person; + else + person = '\376'; + + } else { + ; + switch (verbstr[ddm_o.choicenum + 1]) { + case '\144': { + ; + thing = '\144'; + callverb(vb_buy); + return; + } + break; /* Beer */ + case '\145': { + ; + thing = '\62'; + callverb(vb_buy); + return; + } + break; /* Wine */ + case '\146': { + ; + thing = '\146'; + callverb(vb_buy); + return; + } + break; /* Whisky */ + case '\147': { + ; + thing = '\147'; + callverb(vb_buy); + return; + } + break; /* Cider */ + case '\150': { + ; + thing = '\153'; + callverb(vb_buy); + return; + } + break; /* Mead */ + case '\151': { + ; + thing = '\103'; + callverb(vb_buy); + return; + } + break; /* Onion (trader) */ + default: { + ; + person = thing; + thing = '\376'; + } + } + } + callverb(verbstr[ddm_o.choicenum + 1]); } /*$F- That's all. Now for the ...bar procs. */ -void standard_bar() /* Standard menu bar */ -{; - ddm_m.init(); ddm_o.init(); - {; /* Set up menus */ - create('F',"File",'!',ddm__file,do__file); /* same ones in map_bar, below, */ - create('G',"Game",'\42',ddm__game,do__game); /* Don't forget to change the */ - create('A',"Action",'\36',ddm__action,do__action); /* if you change them */ - create('O',"Objects",'\30',ddm__objects,do__objects); /* here... */ - create('P',"People",'\31',ddm__people,do__people); - create('W',"With",'\21',ddm__with,do__with); - update(); - } +void standard_bar() { /* Standard menu bar */ + ; + ddm_m.init(); + ddm_o.init(); + { + ; /* Set up menus */ + create('F', "File", '!', ddm__file, do__file); /* same ones in map_bar, below, */ + create('G', "Game", '\42', ddm__game, do__game); /* Don't forget to change the */ + create('A', "Action", '\36', ddm__action, do__action); /* if you change them */ + create('O', "Objects", '\30', ddm__objects, do__objects); /* here... */ + create('P', "People", '\31', ddm__people, do__people); + create('W', "With", '\21', ddm__with, do__with); + update(); + } } /*procedure map_bar; { Special menu bar for the map (screen 99) } @@ -769,61 +940,65 @@ begin; end; end;*/ -void checkclick() /* only for when the menu's displayed */ -{; - if (mpress>0) - {; - if (mpy>10) - {; - if (! ((ddm_o.firstlix) && - ((mpx>=(cardinal)ddm_o.flx1*8) && (mpx<=(cardinal)ddm_o.flx2*8) && - (mpy>=12) && (mpy<=(cardinal)ddm_o.fly)))) - {; /* Clicked OUTSIDE the menu. */ - if (ddm_o.menunow) wipe(); - } /* No "else"- clicking on menu has no effect (only releasing) */ - } else - {; /* Clicked on menu bar */ - ddm_m.getmenu(mpx); - } - } else - {; /* NOT clicked button... */ - if (mrelease>0) - {; - if ((ddm_o.firstlix) && - ((mrx>=(cardinal)ddm_o.flx1*8) && (mrx<=(cardinal)ddm_o.flx2*8) && - (mry>=12) && (mry<=(cardinal)ddm_o.fly))) - select((mry-13) / 10); - } - } -} - -void menu_link() -{; - {; - if (! ddm_o.menunow) return; - - check(); /* find mouse coords & click information */ - checkclick(); /* work out click codes */ - - /* Change arrow... */ - - switch (my) { - case RANGE_11(0, 10): newpointer(1); - break; /* up-arrow */ - case 11 ... 169: {; - if ((mx>=(cardinal)ddm_o.flx1*8) && (mx<=(cardinal)ddm_o.flx2*8) && (my>10) && (my<=(cardinal)ddm_o.fly)) - newpointer(3); /* right-arrow */ - else newpointer(4); /* fletch */ - } - break; - case RANGE_32(169,200): newpointer(2); - break; /* screwdriver */ - } - - if (! ddm_o.menunow) return; - - lightup(); - } +void checkclick() { /* only for when the menu's displayed */ + ; + if (mpress > 0) { + ; + if (mpy > 10) { + ; + if (!((ddm_o.firstlix) && + ((mpx >= (cardinal)ddm_o.flx1 * 8) && (mpx <= (cardinal)ddm_o.flx2 * 8) && + (mpy >= 12) && (mpy <= (cardinal)ddm_o.fly)))) { + ; /* Clicked OUTSIDE the menu. */ + if (ddm_o.menunow) wipe(); + } /* No "else"- clicking on menu has no effect (only releasing) */ + } else { + ; /* Clicked on menu bar */ + ddm_m.getmenu(mpx); + } + } else { + ; /* NOT clicked button... */ + if (mrelease > 0) { + ; + if ((ddm_o.firstlix) && + ((mrx >= (cardinal)ddm_o.flx1 * 8) && (mrx <= (cardinal)ddm_o.flx2 * 8) && + (mry >= 12) && (mry <= (cardinal)ddm_o.fly))) + select((mry - 13) / 10); + } + } +} + +void menu_link() { + ; + { + ; + if (! ddm_o.menunow) return; + + check(); /* find mouse coords & click information */ + checkclick(); /* work out click codes */ + + /* Change arrow... */ + + switch (my) { + case RANGE_11(0, 10): + newpointer(1); + break; /* up-arrow */ + case 11 ... 169: { + ; + if ((mx >= (cardinal)ddm_o.flx1 * 8) && (mx <= (cardinal)ddm_o.flx2 * 8) && (my > 10) && (my <= (cardinal)ddm_o.fly)) + newpointer(3); /* right-arrow */ + else newpointer(4); /* fletch */ + } + break; + case RANGE_32(169, 200): + newpointer(2); + break; /* screwdriver */ + } + + if (! ddm_o.menunow) return; + + lightup(); + } } } // End of namespace Avalanche.
\ No newline at end of file |