diff options
Diffstat (limited to 'engines/avalanche/nimunit.cpp')
-rw-r--r-- | engines/avalanche/nimunit.cpp | 820 |
1 files changed, 451 insertions, 369 deletions
diff --git a/engines/avalanche/nimunit.cpp b/engines/avalanche/nimunit.cpp index cfec877c33..785dbe6759 100644 --- a/engines/avalanche/nimunit.cpp +++ b/engines/avalanche/nimunit.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 @@ -39,249 +39,308 @@ namespace Avalanche { -const array<false,true,varying_string<7> > names = {{"Avalot","Dogfood"}}; +const array<false, true, varying_string<7> > names = {{"Avalot", "Dogfood"}}; -array<1,3,byte> old,stones; -array<0,3,0,22,1,7,byte> stonepic; /* picture of Nimstone */ +array<1, 3, byte> old, stones; +array<0, 3, 0, 22, 1, 7, byte> stonepic; /* picture of Nimstone */ byte turns; -boolean dogfoodsturn; byte fv; byte stonesleft; +boolean dogfoodsturn; +byte fv; +byte stonesleft; boolean clicked; -byte row,number; +byte row, number; boolean squeak; -shortint mnum,mrow; - -void chalk(integer x,integer y, string z) -{ - const array<0,3,byte> greys = {{0,8,7,15}}; - byte fv; - - for( fv=0; fv <= 3; fv ++) - { - setcolor(greys[fv]); - outtextxy(x-fv,y,z); - sound(fv*100*length(z)); delay(3); nosound; delay(30); - } +shortint mnum, mrow; + +void chalk(integer x, integer y, string z) { + const array<0, 3, byte> greys = {{0, 8, 7, 15}}; + byte fv; + + for (fv = 0; fv <= 3; fv ++) { + setcolor(greys[fv]); + outtextxy(x - fv, y, z); + sound(fv * 100 * length(z)); + delay(3); + nosound; + delay(30); + } } -void setup() -{ - const integer page3 = 0xac00; - byte gd,gm; - untyped_file f; - byte bit; - - setactivepage(3); - setvisualpage(3); - cleardevice(); - dawn(); - - assign(f,"nim.avd"); - reset(f,1); - seek(f,41); - for( gm=0; gm <= 22; gm ++) - for( bit=0; bit <= 3; bit ++) - { - port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; - blockread(f,stonepic[bit][gm],7); - } - for( gd=1; gd <= 3; gd ++) - for( gm=0; gm <= 22; gm ++) - for( bit=0; bit <= 3; bit ++) - { - port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; - blockread(f,mem[page3*3200+gd*2800+gm*80],7); - } - for( gm=0; gm <= 36; gm ++) - for( bit=0; bit <= 3; bit ++) - { - port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; - blockread(f,mem[page3*400+49+gm*80],30); - } - close(f); - - gd=getpixel(0,0); /* clear codes */ - setcolor(4); rectangle(394,50,634,197); - setfillstyle(1,6); bar(395,51,633,196); - rectangle(10,5,380,70); bar(11,6,379,69); - setcolor(15); - outtextxy(475,53,"SCOREBOARD:"); - setcolor(14); - outtextxy(420,63,"Turn:"); - outtextxy(490,63,"Player:"); - outtextxy(570,63,"Move:"); - - for( gd=1; gd <= 3; gd ++) stones[gd]=gd+2; - - turns=0; dogfoodsturn=true; - - chalk(27,15,"Take pieces away with:"); - chalk(77,25,"1) the mouse (click leftmost)"); - chalk(53,35,"or 2) the keyboard:"); - chalk(220,35,string('\30')+'/'+'\31'+": choose row,"); - chalk(164,45,string("+/- or ")+'\33'+'/'+'\32'+": more/fewer,"); - chalk(204,55,"Enter: take stones."); - - row=1; number=1; fillchar(old,sizeof(old),'\0'); stonesleft=12; - - /* Set up mouse. */ - off_virtual(); - oncandopageswap=false; - - setactivepage(3); - setvisualpage(3); +void setup() { + const integer page3 = 0xac00; + byte gd, gm; + untyped_file f; + byte bit; + + setactivepage(3); + setvisualpage(3); + cleardevice(); + dawn(); + + assign(f, "nim.avd"); + reset(f, 1); + seek(f, 41); + for (gm = 0; gm <= 22; gm ++) + for (bit = 0; bit <= 3; bit ++) { + port[0x3c4] = 2; + port[0x3ce] = 4; + port[0x3c5] = 1 << bit; + port[0x3cf] = bit; + blockread(f, stonepic[bit][gm], 7); + } + for (gd = 1; gd <= 3; gd ++) + for (gm = 0; gm <= 22; gm ++) + for (bit = 0; bit <= 3; bit ++) { + port[0x3c4] = 2; + port[0x3ce] = 4; + port[0x3c5] = 1 << bit; + port[0x3cf] = bit; + blockread(f, mem[page3 * 3200 + gd * 2800 + gm * 80], 7); + } + for (gm = 0; gm <= 36; gm ++) + for (bit = 0; bit <= 3; bit ++) { + port[0x3c4] = 2; + port[0x3ce] = 4; + port[0x3c5] = 1 << bit; + port[0x3cf] = bit; + blockread(f, mem[page3 * 400 + 49 + gm * 80], 30); + } + close(f); + + gd = getpixel(0, 0); /* clear codes */ + setcolor(4); + rectangle(394, 50, 634, 197); + setfillstyle(1, 6); + bar(395, 51, 633, 196); + rectangle(10, 5, 380, 70); + bar(11, 6, 379, 69); + setcolor(15); + outtextxy(475, 53, "SCOREBOARD:"); + setcolor(14); + outtextxy(420, 63, "Turn:"); + outtextxy(490, 63, "Player:"); + outtextxy(570, 63, "Move:"); + + for (gd = 1; gd <= 3; gd ++) stones[gd] = gd + 2; + + turns = 0; + dogfoodsturn = true; + + chalk(27, 15, "Take pieces away with:"); + chalk(77, 25, "1) the mouse (click leftmost)"); + chalk(53, 35, "or 2) the keyboard:"); + chalk(220, 35, string('\30') + '/' + '\31' + ": choose row,"); + chalk(164, 45, string("+/- or ") + '\33' + '/' + '\32' + ": more/fewer,"); + chalk(204, 55, "Enter: take stones."); + + row = 1; + number = 1; + fillchar(old, sizeof(old), '\0'); + stonesleft = 12; + + /* Set up mouse. */ + off_virtual(); + oncandopageswap = false; + + setactivepage(3); + setvisualpage(3); } -void plotstone(byte x,byte y) -{ - byte fv,bit; word ofs; - - ofs=3200+y*2800+x*8; - for( fv=0; fv <= 22; fv ++) - for( bit=0; bit <= 3; bit ++) - { - port[0x3c4]=2; port[0x3ce]=4; port[0x3c5]=1 << bit; port[0x3cf]=bit; - move(stonepic[bit][fv],mem[0xac00*ofs+fv*80],7); - } +void plotstone(byte x, byte y) { + byte fv, bit; + word ofs; + + ofs = 3200 + y * 2800 + x * 8; + for (fv = 0; fv <= 22; fv ++) + for (bit = 0; bit <= 3; bit ++) { + port[0x3c4] = 2; + port[0x3ce] = 4; + port[0x3c5] = 1 << bit; + port[0x3cf] = bit; + move(stonepic[bit][fv], mem[0xac00 * ofs + fv * 80], 7); + } } -void board() -{ - byte fv,ff; +void board() { + byte fv, ff; - for( fv=1; fv <= 3; fv ++) - for( ff=1; ff <= stones[fv]; ff ++) - plotstone(ff,fv); + for (fv = 1; fv <= 3; fv ++) + for (ff = 1; ff <= stones[fv]; ff ++) + plotstone(ff, fv); } -void startmove() -{ - varying_string<2> tstr; integer ypos; - - turns += 1; str(turns,2,tstr); ypos=63+turns*10; - dogfoodsturn=! dogfoodsturn; - chalk(433,ypos,tstr); - chalk(493,ypos,names[dogfoodsturn]); - old=stones; +void startmove() { + varying_string<2> tstr; + integer ypos; + + turns += 1; + str(turns, 2, tstr); + ypos = 63 + turns * 10; + dogfoodsturn = ! dogfoodsturn; + chalk(433, ypos, tstr); + chalk(493, ypos, names[dogfoodsturn]); + old = stones; } -void show_changes() -{ - byte fv,ff,fq; varying_string<2> move; +void show_changes() { + byte fv, ff, fq; + varying_string<2> move; - move=string(chr(64+row))+chr(48+number); - chalk(573,63+turns*10,move); - log_aside(names[dogfoodsturn]+" plays "+move+'.'); + move = string(chr(64 + row)) + chr(48 + number); + chalk(573, 63 + turns * 10, move); + log_aside(names[dogfoodsturn] + " plays " + move + '.'); - for( fv=1; fv <= 3; fv ++) - if (old[fv]>stones[fv]) - for( ff=stones[fv]+1; ff <= old[fv]; ff ++) - for( fq=0; fq <= 22; fq ++) fillchar(mem[0xac00*3200+fv*2800+ff*8+fq*80],7,'\0'); - stonesleft -= number; + for (fv = 1; fv <= 3; fv ++) + if (old[fv] > stones[fv]) + for (ff = stones[fv] + 1; ff <= old[fv]; ff ++) + for (fq = 0; fq <= 22; fq ++) fillchar(mem[0xac00 * 3200 + fv * 2800 + ff * 8 + fq * 80], 7, '\0'); + stonesleft -= number; } void checkmouse(); -static void blip() { note(1771); delay(3); nosound; clicked=false; } +static void blip() { + note(1771); + delay(3); + nosound; + clicked = false; +} -void checkmouse() -{ - xycheck(); /* Check the mouse */ - clicked=keystatus>0; - if (clicked) - { - void& with = r; - /* The mouse was clicked. Where? */ - mrow=(my-38) / 35; - if ((mrow<1) || (mrow>3)) blip(); - mnum=stones[mrow]-(mx / 64)+1; - if ((mnum<1) || (mnum>(unsigned char)stones[mrow])) blip(); - } +void checkmouse() { + xycheck(); /* Check the mouse */ + clicked = keystatus > 0; + if (clicked) { + void &with = r; + /* The mouse was clicked. Where? */ + mrow = (my - 38) / 35; + if ((mrow < 1) || (mrow > 3)) blip(); + mnum = stones[mrow] - (mx / 64) + 1; + if ((mnum < 1) || (mnum > (unsigned char)stones[mrow])) blip(); + } } void takesome(); -static void less() { if (number>1) number -= 1; } - -void takesome() -{ - char r; byte sr; - - number=1; - do { - do { - sr=stones[row]; - if (sr==0) { row=row % 3+1; number=1; } - } while (!(sr!=0)); - if (number>sr) number=sr; - setcolor(1); rectangle(63+(sr-number)*64,38+35*row,54+sr*64,63+35*row); - /* Wait for choice */ - on(); - do { checkmouse(); } while (!(keypressed() || clicked)); - if (keypressed()) r=upcase(readkey()); - off(); - - setcolor(0); rectangle(63+(sr-number)*64,38+35*row,54+sr*64,63+35*row); - - if (clicked) - { - number=mnum; - row=mrow; - return; - } else - { - switch (r) { - case '\0': switch (readkey()) { - case 'H': if (row>1) row -= 1; break; /* Up */ - case 'P': if (row<3) row += 1; break; /* Down */ - case 'K': number += 1; break; - case 'M': less(); break; - case 'I': row=1; break; /* PgUp */ - case 'Q': row=3; break; /* PgDn */ - case 'G': number=5; break; /* Home- check routine will knock this down to size */ - case 'O': number=1; break; /* End */ - } - break; - case '+': number += 1; break; - case '-': less(); break; - case RANGE_3('A','C'): row=ord(r)-64; - break; - case RANGE_5('1','5'): number=ord(r)-48; - break; - case '\15': return; break; /* Enter was pressed */ - } - } - } while (!false); +static void less() { + if (number > 1) number -= 1; } -void endofgame() -{ - char rr; - - chalk(595,63+turns*10,"Wins!"); - outtextxy(100,190,"- - - Press any key... - - -"); - while (keypressed()) rr=readkey(); - do { check(); } while (!(mpress==0)); - - { void& with = r; do { check(); } while (!(keypressed() || (mrelease>0)));} - if (keypressed()) rr=readkey(); +void takesome() { + char r; + byte sr; + + number = 1; + do { + do { + sr = stones[row]; + if (sr == 0) { + row = row % 3 + 1; + number = 1; + } + } while (!(sr != 0)); + if (number > sr) number = sr; + setcolor(1); + rectangle(63 + (sr - number) * 64, 38 + 35 * row, 54 + sr * 64, 63 + 35 * row); + /* Wait for choice */ + on(); + do { + checkmouse(); + } while (!(keypressed() || clicked)); + if (keypressed()) r = upcase(readkey()); + off(); + + setcolor(0); + rectangle(63 + (sr - number) * 64, 38 + 35 * row, 54 + sr * 64, 63 + 35 * row); + + if (clicked) { + number = mnum; + row = mrow; + return; + } else { + switch (r) { + case '\0': + switch (readkey()) { + case 'H': + if (row > 1) row -= 1; + break; /* Up */ + case 'P': + if (row < 3) row += 1; + break; /* Down */ + case 'K': + number += 1; + break; + case 'M': + less(); + break; + case 'I': + row = 1; + break; /* PgUp */ + case 'Q': + row = 3; + break; /* PgDn */ + case 'G': + number = 5; + break; /* Home- check routine will knock this down to size */ + case 'O': + number = 1; + break; /* End */ + } + break; + case '+': + number += 1; + break; + case '-': + less(); + break; + case RANGE_3('A', 'C'): + row = ord(r) - 64; + break; + case RANGE_5('1', '5'): + number = ord(r) - 48; + break; + case '\15': + return; + break; /* Enter was pressed */ + } + } + } while (!false); +} - mousepage(cp); - off(); - on_virtual(); +void endofgame() { + char rr; + + chalk(595, 63 + turns * 10, "Wins!"); + outtextxy(100, 190, "- - - Press any key... - - -"); + while (keypressed()) rr = readkey(); + do { + check(); + } while (!(mpress == 0)); + + { + void &with = r; + do { + check(); + } while (!(keypressed() || (mrelease > 0))); + } + if (keypressed()) rr = readkey(); + + mousepage(cp); + off(); + on_virtual(); } void dogfood(); - /* AI procedure to play the game */ -const matrix<1,3,1,2,byte> other = {{{{2,3}},{{1,3}},{{1,2}}}}; +/* AI procedure to play the game */ +const matrix<1, 3, 1, 2, byte> other = {{{{2, 3}}, {{1, 3}}, {{1, 2}}}}; -static byte live,fv,ff,matches,thisone,where; +static byte live, fv, ff, matches, thisone, where; -static array<1,3,byte> r,sr; -static array<1,3,boolean> inap; +static array<1, 3, byte> r, sr; +static array<1, 3, boolean> inap; static boolean lmo; /* Let Me Out! */ @@ -289,183 +348,206 @@ static byte ooo; /* Odd one out */ static boolean find(byte x) - /* This gives True if there's a pile with x stones in. */ +/* This gives True if there's a pile with x stones in. */ { - boolean q; byte p; - - boolean find_result; - q=false; - for( p=1; p <= 3; p ++) if (stones[p]==x) { q=true; inap[p]=true; } - find_result=q; - return find_result; + boolean q; + byte p; + + boolean find_result; + q = false; + for (p = 1; p <= 3; p ++) if (stones[p] == x) { + q = true; + inap[p] = true; + } + find_result = q; + return find_result; } -static void find_ap(byte start,byte stepsize) -{ - byte ff; - - matches=0; - fillchar(inap,sizeof(inap),'\0'); /* blank 'em all */ - for( ff=0; ff <= 2; ff ++) if (find(start+ff*stepsize)) matches += 1; - else thisone=ff; - - /* Now.. Matches must be 0, 1, 2, or 3. - 0/1 mean there are no A.P.s here, so we'll keep looking, - 2 means there is a potential A.P. that we can create (ideal!), and - 3 means that we're already in an A.P. (Trouble!). */ - - switch (matches) { - case 2: { - for( ff=1; ff <= 3; ff ++) /* find which one didn't fit the A.P. */ - if (! inap[ff]) ooo=ff; - if (stones[ooo]>(start+thisone*stepsize)) /* check it's possible! */ - { /* create an A.P. */ - row=ooo; /* already calculated */ - /* Start+thisone*stepsize will give the amount we SHOULD have here. */ - number=stones[row]-(start+thisone*stepsize); lmo=true; return; - } - } - break; - case 3: { /* we're actually IN an A.P! Trouble! Oooh dear. */ - row=r[3]; number=1; lmo=true; return; /* take 1 from the largest pile */ - } - break; - } +static void find_ap(byte start, byte stepsize) { + byte ff; + + matches = 0; + fillchar(inap, sizeof(inap), '\0'); /* blank 'em all */ + for (ff = 0; ff <= 2; ff ++) if (find(start + ff * stepsize)) matches += 1; + else thisone = ff; + + /* Now.. Matches must be 0, 1, 2, or 3. + 0/1 mean there are no A.P.s here, so we'll keep looking, + 2 means there is a potential A.P. that we can create (ideal!), and + 3 means that we're already in an A.P. (Trouble!). */ + + switch (matches) { + case 2: { + for (ff = 1; ff <= 3; ff ++) /* find which one didn't fit the A.P. */ + if (! inap[ff]) ooo = ff; + if (stones[ooo] > (start + thisone * stepsize)) { /* check it's possible! */ + /* create an A.P. */ + row = ooo; /* already calculated */ + /* Start+thisone*stepsize will give the amount we SHOULD have here. */ + number = stones[row] - (start + thisone * stepsize); + lmo = true; + return; + } + } + break; + case 3: { /* we're actually IN an A.P! Trouble! Oooh dear. */ + row = r[3]; + number = 1; + lmo = true; + return; /* take 1 from the largest pile */ + } + break; + } } -void dogfood() -{ - boolean sorted; byte temp; - - - live=0; lmo=false; - for( fv=1; fv <= 3; fv ++) - { - if (stones[fv]>0) - { - live += 1; - r[live]=fv; sr[live]=stones[fv]; - } - } - switch (live) { - case 1: /* Only one is free- so take 'em all */ - { row=r[1]; number=stones[r[1]]; return; } - break; - case 2: /* Two are free- make them equal */ - { - if (sr[1]>sr[2]) - { row=r[1]; number=sr[1]-sr[2]; return; } else /* T > b */ - if (sr[1]<sr[2]) - { row=r[2]; number=sr[2]-sr[1]; return; } else /* B > t */ - { row=r[1]; number=1; return; } /* B = t... oh no, we've lost! */ - } - break; - case 3: /* Ho hum... this'll be difficult! */ - { - /* There are three possible courses of action when we have 3 lines left: - 1) Look for 2 equal lines, then take the odd one out. - 2) Look for A.P.s, and capitalise on them. - 3) Go any old where. */ - - for( fv=1; fv <= 3; fv ++) /* Look for 2 equal lines */ - if (stones[other[fv][1]]==stones[other[fv][2]]) - { - row=fv; /* this row */ number=stones[fv]; /* all of 'em */ return; - } - - do { - sorted=true; - for( fv=1; fv <= 2; fv ++) - if (sr[fv]>sr[fv+1]) - { - temp=sr[fv+1]; sr[fv+1]=sr[fv]; sr[fv]=temp; - temp= r[fv+1]; r[fv+1]= r[fv]; r[fv]=temp; - sorted=false; - } - } while (!sorted); - /* Now we look for A.P.s ... */ - for( fv=1; fv <= 3; fv ++) - { - find_ap(fv,1); /* there are 3 "1"s */ - if (lmo) return; /* cut-out */ - } - find_ap(1,2); /* only "2" possible */ - if (lmo) return; - - /* A.P. search must have failed- use the default move. */ - row=r[3]; number=1; return; - } - break; - } +void dogfood() { + boolean sorted; + byte temp; + + + live = 0; + lmo = false; + for (fv = 1; fv <= 3; fv ++) { + if (stones[fv] > 0) { + live += 1; + r[live] = fv; + sr[live] = stones[fv]; + } + } + switch (live) { + case 1: { /* Only one is free- so take 'em all */ + row = r[1]; + number = stones[r[1]]; + return; + } + break; + case 2: { /* Two are free- make them equal */ + if (sr[1] > sr[2]) { + row = r[1]; + number = sr[1] - sr[2]; + return; + } else /* T > b */ + if (sr[1] < sr[2]) { + row = r[2]; + number = sr[2] - sr[1]; + return; + } else { /* B > t */ + row = r[1]; /* B = t... oh no, we've lost! */ + number = 1; + return; + } + } + break; + case 3: { /* Ho hum... this'll be difficult! */ + /* There are three possible courses of action when we have 3 lines left: + 1) Look for 2 equal lines, then take the odd one out. + 2) Look for A.P.s, and capitalise on them. + 3) Go any old where. */ + + for (fv = 1; fv <= 3; fv ++) /* Look for 2 equal lines */ + if (stones[other[fv][1]] == stones[other[fv][2]]) { + row = fv; /* this row */ number = stones[fv]; /* all of 'em */ return; + } + + do { + sorted = true; + for (fv = 1; fv <= 2; fv ++) + if (sr[fv] > sr[fv + 1]) { + temp = sr[fv + 1]; + sr[fv + 1] = sr[fv]; + sr[fv] = temp; + temp = r[fv + 1]; + r[fv + 1] = r[fv]; + r[fv] = temp; + sorted = false; + } + } while (!sorted); + /* Now we look for A.P.s ... */ + for (fv = 1; fv <= 3; fv ++) { + find_ap(fv, 1); /* there are 3 "1"s */ + if (lmo) return; /* cut-out */ + } + find_ap(1, 2); /* only "2" possible */ + if (lmo) return; + + /* A.P. search must have failed- use the default move. */ + row = r[3]; + number = 1; + return; + } + break; + } } void play_nim() /* Plays the game. Only procedure in this unit to be declared in the interface section. */ { - byte groi; - - if (dna.wonnim) - { /* Already won the game. */ - dixi('Q',6); - return; - } - - if (! dna.asked_dogfood_about_nim) - { - dixi('q',84); - return; - } - - dixi('Q',3); - dna.playednim += 1; - dusk(); - oncandopageswap=false; - copypage(3,1-cp); /* Store old screen. */ groi=getpixel(0,0); - off(); - - setup(); - board(); - on(); - mousepage(3); - - do { - startmove(); - if (dogfoodsturn) dogfood(); else takesome(); - stones[row] -= number; - show_changes(); - } while (!(stonesleft==0)); - endofgame(); /* Winning sequence is A1, B3, B1, C1, C1, btw. */ - - dusk(); off(); - oncandopageswap=true; - copypage(1-cp,3); /* Restore old screen. */ groi=getpixel(0,0); - on(); dawn(); - - if (dogfoodsturn) - { /* Dogfood won - as usual */ - log_aside("He won."); - if (dna.playednim==1) /* Your first game */ - dixi('Q',4); /* Goody! Play me again? */ - else - dixi('Q',5); /* Oh, look at that! I've won again! */ - pennycheck(4); /* And you've just lost 4d! */ - } else - { /* You won - strange! */ - log_aside("You won."); - dixi('Q',7); /* You won! Give us a lute! */ - dna.obj[lute]=true; - objectlist(); - dna.wonnim=true; - show_one(1); /* Show the settle with no lute on it. */ - points(7); /* 7 points for winning! */ - } - - if (dna.playednim==1) points(3); /* 3 points for playing your 1st game. */ + byte groi; + + if (dna.wonnim) { + /* Already won the game. */ + dixi('Q', 6); + return; + } + + if (! dna.asked_dogfood_about_nim) { + dixi('q', 84); + return; + } + + dixi('Q', 3); + dna.playednim += 1; + dusk(); + oncandopageswap = false; + copypage(3, 1 - cp); /* Store old screen. */ groi = getpixel(0, 0); + off(); + + setup(); + board(); + on(); + mousepage(3); + + do { + startmove(); + if (dogfoodsturn) dogfood(); + else takesome(); + stones[row] -= number; + show_changes(); + } while (!(stonesleft == 0)); + endofgame(); /* Winning sequence is A1, B3, B1, C1, C1, btw. */ + + dusk(); + off(); + oncandopageswap = true; + copypage(1 - cp, 3); /* Restore old screen. */ groi = getpixel(0, 0); + on(); + dawn(); + + if (dogfoodsturn) { + /* Dogfood won - as usual */ + log_aside("He won."); + if (dna.playednim == 1) /* Your first game */ + dixi('Q', 4); /* Goody! Play me again? */ + else + dixi('Q', 5); /* Oh, look at that! I've won again! */ + pennycheck(4); /* And you've just lost 4d! */ + } else { + /* You won - strange! */ + log_aside("You won."); + dixi('Q', 7); /* You won! Give us a lute! */ + dna.obj[lute] = true; + objectlist(); + dna.wonnim = true; + show_one(1); /* Show the settle with no lute on it. */ + points(7); /* 7 points for winning! */ + } + + if (dna.playednim == 1) points(3); /* 3 points for playing your 1st game. */ } - /* No init part. */ +/* No init part. */ } // End of namespace Avalanche.
\ No newline at end of file |