aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/mortevielle/actions.h1372
-rw-r--r--engines/mortevielle/alert.h214
-rw-r--r--engines/mortevielle/boite.h30
-rw-r--r--engines/mortevielle/disk.h80
-rw-r--r--engines/mortevielle/droite.h35
-rw-r--r--engines/mortevielle/keyboard.h59
-rw-r--r--engines/mortevielle/level15.h186
-rw-r--r--engines/mortevielle/menu.h306
-rw-r--r--engines/mortevielle/mor.h1457
-rw-r--r--engines/mortevielle/mor2.h764
-rw-r--r--engines/mortevielle/mort.cpp124
-rw-r--r--engines/mortevielle/mouse.h469
-rw-r--r--engines/mortevielle/outtext.h205
-rw-r--r--engines/mortevielle/ovd1.h347
-rw-r--r--engines/mortevielle/parole.h432
-rw-r--r--engines/mortevielle/parole2.h103
-rw-r--r--engines/mortevielle/prog.h346
-rw-r--r--engines/mortevielle/ques.h121
-rw-r--r--engines/mortevielle/sprint.h55
-rw-r--r--engines/mortevielle/taffich.h216
-rw-r--r--engines/mortevielle/var_mor.h485
21 files changed, 7406 insertions, 0 deletions
diff --git a/engines/mortevielle/actions.h b/engines/mortevielle/actions.h
new file mode 100644
index 0000000000..fd4ae2e0b6
--- /dev/null
+++ b/engines/mortevielle/actions.h
@@ -0,0 +1,1372 @@
+/* NIVEAU 4 */
+const char stouinon[] = "[2][ ][OUI][NON]";
+
+/* overlay */ void taller()
+
+{
+ integer mx,cx,cy;
+
+ if ((s.mlieu== 26) && (msg[4]== depl[6]))
+ {
+ s.mlieu= 15;
+ caff= s.mlieu;
+ afdes(0);
+ repon(2,s.mlieu);
+ }
+ if ((s.mlieu== 15) && (msg[4]== depl[6]))
+ {
+ if (! syn) ecr3("aller");
+ tfleche();
+ if (iesc) okdes= false;
+ if ((anyone) || (iesc)) return;
+ tcoord(1);
+ if (num== 0) return;
+ if (num== 1)
+ {
+ s.mlieu= 0;
+ tmlieu(0);
+ }
+ else
+ if (num== 7)
+ {
+ s.mlieu= 13;
+ tmlieu(13);
+ }
+ else
+ if (num!= 6) s.mlieu= 26;
+ if ((num> 1) && (num< 6)) ment= num- 1;
+ if (num> 7) ment= num- 3;
+ if (num!= 6) affrep(); else aldepl();
+ return;
+ }
+ tsort();
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ } while (!(depl[cx]== msg[4]));
+ if (s.mlieu== 19)
+ {
+ if (cx== 1) t1deva();
+ if (cx== 2) t1neig();
+ goto L2;
+ }
+ if (s.mlieu== 23)
+ {
+ if (cx== 1) t1deau();
+ if (cx== 2) t1derr();
+ goto L2;
+ }
+ if ((s.mlieu== 11) && (cx== 1)) cx= 6;
+ if (s.mlieu== 12)
+ {
+ if (cx== 2) cx= 6;
+ if (cx== 5) cx= 16;
+ }
+ if ((s.mlieu== 14) && (cx== 3)) cx= 6;
+ if (((s.mlieu== 15) || (s.mlieu== 26)) && (cx== 4)) cx= 6;
+ if ((s.mlieu> 19) && (s.mlieu!= 26)) cx= cx+ 10;
+ if ((s.mlieu== 20) && (cx== 13)) cx= 16;
+ if (s.mlieu== 21)
+ {
+ if (cx== 12) cx= 16; else
+ if (cx> 13) cx= 15;
+ }
+ if ((s.mlieu== 22) && (cx> 14)) cx= 15;
+ if ((s.mlieu== 24) && (cx!= 17))
+ if (cx> 13) cx= 15;
+ if (cx== 1) s.mlieu= 11; else
+ if (cx== 2) s.mlieu= 12; else
+ if (cx== 3) s.mlieu= 14; else
+ if (cx== 4) s.mlieu= 15; else
+ if (cx== 5) cx= 12;
+ if (cx== 6) cx= 11;
+ if (cx== 11) t1sama(); else
+ if (cx== 12) t1deva(); else
+ if (cx== 13) s.mlieu= 20; else
+ if (cx== 14) s.mlieu= 24; else
+ if (cx== 15) t1neig(); else
+ if (cx== 16) t1derr(); else
+ if (cx== 17)
+ {
+ if ((s.ipuit!= 120) && (s.ipuit!= 140)) crep= 997; else
+ if (s.ipuit== 120) crep= 181; else
+ if (s.conf> 80)
+ {
+ crep= 1505;
+ tperd();
+ }
+ else
+ {
+ s.mlieu= 23;
+ affrep();
+ }
+ }
+ if ((cx< 5) || (cx== 13) || (cx== 14)) affrep();
+ debloc(s.mlieu);
+L2:
+ tmlieu(s.mlieu);
+}
+
+/* overlay */ void tprendre()
+{
+ integer cx, cy, cz;
+
+ if (caff> 99)
+ {
+ cx= caff;
+ avpoing(cx);
+ if (crep!= 139)
+ {
+ if (ipers> 0) s.conf= s.conf+ 3;
+ if (obpart)
+ {
+ if (s.mlieu== 2) s.iloic= 0;
+ if (s.mlieu== 13)
+ {
+ if (s.iboul== caff) s.iboul= 0;
+ if (s.ibag== caff) s.ibag= 0;
+ }
+ if (s.mlieu== 14) s.icave= 0;
+ if (s.mlieu== 16) s.icryp= 0;
+ if (s.mlieu== 17) s.ivier= 0;
+ if (s.mlieu== 24) s.ipuit= 0;
+ mfouen();
+ obpart= false;
+ affrep();
+ }
+ else
+ {
+ tabdon[acha+ (pred(integer,mchai)* 10)+ pred(integer,cs)]=0;
+ tsuiv();
+ dobj= dobj+ 1;
+ if (dobj> 6)
+ {
+ s.conf= s.conf+ 2;
+ dobj= 0;
+ }
+ }
+ }
+ return;
+ }
+ if (! syn) ecr3("prendre");
+ tfleche();
+ if ((anyone) || (iesc)) return;
+ if (caff== 3)
+ {
+ tcoord(2);
+ if (num== 1)
+ {
+ crep= 152;
+ return;
+ }
+ }
+ tcoord(5);
+ if ((num== 0) || ((num== 1) && (s.mlieu== 16)))
+ {
+ tcoord(8);
+ if (num!= 0)
+ {
+ if (ipers> 0) s.conf= s.conf+ 3;
+ crep= 997;
+ if ((s.mlieu== 2) && (s.iloic!= 0)) avpoing(s.iloic);
+ if ((s.mlieu==13) && (num==1) && (s.iboul!=0))
+ {
+ avpoing(s.iboul);
+ if ((crep!= 997) && (crep!= 139)) aniof(2,7);
+ }
+ if ((s.mlieu==13) && (num==2) && (s.ibag!=0))
+ {
+ avpoing(s.ibag);
+ if ((crep!= 997) && (crep!= 139)) aniof(2,6);
+ }
+ if ((s.mlieu== 14) && (s.icave!= 0))
+ {
+ avpoing(s.icave);
+ if ((crep!= 997) && (crep!= 139)) aniof(2,2);
+ }
+ if ((s.mlieu== 16) && (s.icryp!= 0)) avpoing(s.icryp);
+ if ((s.mlieu== 17) && (s.ivier!= 0))
+ {
+ avpoing(s.ivier);
+ if ((crep!= 997) && (crep!= 139))
+ {
+ crep= 182;
+ aniof(2,1);
+ }
+ }
+ if ((s.mlieu== 24) && (s.ipuit!= 0))
+ {
+ avpoing(s.ipuit);
+ if ((crep!= 997) && (crep!= 139)) aniof(2,1);
+ }
+ if ((crep!= 997) && (crep!= 182) && (crep!= 139)) crep= 999;
+ }
+ }
+ else
+ {
+ if (((s.mlieu== 0) && (num== 3)) || ((s.mlieu== 1) && (num== 4))
+ || ((s.mlieu== 2) && (num== 1)) || ((s.mlieu== 4) && (num== 3))
+ || ((s.mlieu== 5) && (num== 6)) || ((s.mlieu== 6) && (num== 2))
+ || ((s.mlieu== 7) && (num== 6)) || ((s.mlieu== 8) && (num== 4))
+ || ((s.mlieu== 9) && (num== 4)) || ((s.mlieu== 10) && (num> 2))
+ || ((s.mlieu== 11) && (num== 7)) || ((s.mlieu== 12) && (num== 6))
+ || ((s.mlieu== 13) && (num> 4)) || ((s.mlieu> 13)
+ && (s.mlieu!= 23))) crep= 997; else
+ {
+ if (s.mlieu== 23)
+ {
+ crep= 1504;
+ tperd();
+ }
+ else crep= 120;
+ }
+ }
+}
+
+/* overlay */ void tsprendre()
+{
+ integer cx,cy,cz;
+
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ } while (!(invt[cx]== msg[4]));
+ cz= 0;
+ cy= 0;
+ do {
+ cy= cy+ 1;
+ if (ord(s.sjer[cy])!= 0) cz= cz+ 1;
+ } while (!(cz== cx));
+ cz= ord(s.sjer[cy]);
+ s.sjer[cy]= chr(0);
+ modinv();
+ avpoing(cz);
+ crep= 998;
+ clsf2();
+}
+
+/* overlay */ void tsoulever()
+
+{
+ integer cx;
+
+ if (! syn) ecr3("soulever");
+ tfleche();
+ if ((anyone) || (iesc)) return;
+ tcoord(3);
+ if (num== 0)
+ {
+ tcoord(8);
+ if (num!= 0)
+ {
+ if (ipers> 0) s.conf= s.conf+ 1;
+ crep= 997;
+ if ((s.mlieu== 2) && (s.iloic!= 0)) treg(s.iloic);
+ }
+ return;
+ }
+ if (ipers> 0) s.conf= s.conf+ 1;
+ cx= s.mlieu;
+ if (s.mlieu== 16) cx= 14;
+ if (s.mlieu== 19) cx= 15;
+ crep= tabdon[asoul+(cx << 3)+pred(integer,num)];
+ if (crep== 255) crep= 997;
+}
+
+/* overlay */ void tlire()
+{
+ integer iaff;
+
+ if (caff> 99) st4(caff); else
+ {
+ if (! syn) ecr3("lire");
+ tfleche();
+ if (! (anyone) && ! (iesc))
+ {
+ tcoord(4);
+ if (num!= 0) crep= 107;
+ }
+ }
+}
+
+/* overlay */ void tslire()
+{
+ if (s.derobj== 0) crep= 186; else st4(s.derobj);
+}
+
+/* overlay */ void tregarder()
+{
+ integer cx;
+
+ if (caff> 99)
+ {
+ crep= 103;
+ return;
+ }
+ if (! syn) ecr3("regarder");
+ tfleche();
+ if ((anyone) || (iesc)) return;
+ tcoord(5);
+ if (num== 0)
+ {
+ tcoord(8);
+ crep= 131;
+ if (num!= 0)
+ {
+ if (s.mlieu== 13)
+ {
+ if (num== 1)
+ {
+ crep= 164;
+ if (s.ibag!= 0) treg(s.ibag); else
+ if (s.iboul!= 0) treg(s.iboul);
+ }
+ else
+ {
+ crep= 193;
+ if (s.ibag!= 0) treg(s.ibag);
+ }
+ }
+ if (s.mlieu== 14)
+ {
+ crep= 164;
+ if (s.icave!= 0) treg(s.icave);
+ }
+ if (s.mlieu== 17)
+ {
+ crep= 174;
+ if (s.ivier!= 0) treg(s.ivier);
+ }
+ if (s.mlieu== 24)
+ {
+ crep= 131;
+ if (s.ipuit!= 0) treg(s.ipuit);
+ }
+ }
+ return;
+ }
+ cx= s.mlieu;
+ if (s.mlieu== 20) cx= 17;
+ if ((s.mlieu> 21) && (s.mlieu< 25)) cx= cx- 4;
+ if (s.mlieu== 26) cx= 21;
+ crep= tabdon[arega+(cx*7)+pred(integer,num)];
+ if ((s.mlieu== 13) && (num== 8)) crep= 126;
+ if (s.mlieu== 19) crep= 103;
+ if (crep== 255) crep= 131;
+ if ((s.mlieu== 1) && (num== 1)) treg(144);
+ if ((s.mlieu== 5) && (num== 3)) treg(147);
+ if ((s.mlieu== 8) && (num== 3)) treg(149);
+ if ((s.mlieu== 9) && (num== 2)) treg(30);
+ if ((s.mlieu== 10) && (num== 3)) treg(31);
+}
+
+/* overlay */ void tsregarder()
+{
+ if (s.derobj!= 0) treg(s.derobj); else crep= 186;
+}
+
+/* overlay */ void tfouiller()
+{
+ const array<0,13,byte> r = {{123,104,123,131,131,123,104,131,123,123,106,123,123,107}};
+ integer cx;
+
+ if (caff> 99)
+ {
+ st7(caff);
+ return;
+ }
+ if (! syn) ecr3("fouiller");
+ tfleche();
+ if (anyone || iesc) return;
+ if (s.mlieu==23)
+ {
+ crep= 1504;
+ tperd();
+ return;
+ }
+ tcoord(6);
+ if (num== 0)
+ {
+ tcoord(7);
+ if (num!=0)
+ {
+ cx=0;
+ do {
+ cx=cx+1;
+ } while (!((cx>6) || (num== ord(touv[cx]))));
+ if (num!=ord(touv[cx])) crep=187; else
+ {
+ if (ipers>0) s.conf= s.conf+3;
+ rechai(mchai);
+ if (mchai!=0)
+ {
+ cs=0;
+ is=0;
+ fouil=true;
+ mfoudi();
+ tsuiv();
+ }
+ else crep=997;
+ }
+ }
+ else
+ {
+ tcoord(8);
+ crep= 997;
+ if (num!=0)
+ {
+ if (ipers>0) s.conf=s.conf+3;
+ if ((s.mlieu!=24) && (s.mlieu!=17) && (s.mlieu!=13))
+ {
+ if (s.mlieu==2)
+ {
+ crep= 123;
+ if (s.iloic!=0) treg(s.iloic);
+ }
+ if (s.mlieu==16)
+ {
+ crep= 123;
+ if (s.icryp!=0) treg(s.icryp);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ if (ipers>0) s.conf=s.conf+ 3;
+ crep= 997;
+ if (s.mlieu < 14) crep= r[s.mlieu];
+ if ((s.mlieu== 3) && (num== 2)) crep=162;
+ if (s.mlieu== 12)
+ {
+ if ((num== 3) || (num== 4)) crep=162;
+ if (num== 5) crep= 159;
+ }
+ if (s.mlieu==19) crep=104;
+ if (s.mlieu==16) crep=155;
+ }
+}
+
+/* overlay */ void tsfouiller()
+{
+ if (s.derobj!=0) st7(s.derobj); else crep= 186;
+}
+
+/* overlay */ void touvrir()
+{
+ integer cx,haz;
+
+ if (! syn) ecr3("ouvrir");
+ if (caff== 26)
+ {
+ if (ment!= 0)
+ {
+ msg[4]= entrer;
+ syn= true;
+ }
+ else crep= 997;
+ return;
+ }
+ if (caff== 15)
+ {
+ aldepl();
+ return;
+ }
+ tfleche();
+ if ((anyone) || (iesc)) return;
+ tcoord(7);
+ if (num!= 0)
+ {
+ if (ipers> 0) s.conf= s.conf+ 2;
+ iouv= iouv+ 1;
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ } while (!((cx> 6) || (ord(touv[cx])== 0) || (ord(touv[cx])== num)));
+ if (ord(touv[cx])!= num)
+ {
+ if (!
+ (
+ ( (num== 3) && ((s.mlieu== 0) || (s.mlieu== 9) || (s.mlieu== 5) || (s.mlieu== 7)) )
+ ||
+ ((num== 4) && ((s.mlieu== 1) || (s.mlieu== 2) || (s.mlieu== 6))) ||
+ ((s.mlieu== 4) && (num== 5)) ||
+ ((num== 6) && ((s.mlieu== 7) || (s.mlieu== 10) ||
+ (s.mlieu== 8) || (s.mlieu== 13))) ||
+ ((s.mlieu== 8) && (num== 2)) ||
+ ((s.mlieu== 12) && (num== 7))))
+ {
+ if (((s.mlieu> 10) && (s.mlieu< 14)) ||
+ ((s.mlieu> 6) && (s.mlieu< 10)) ||
+ (s.mlieu== 0) || (s.mlieu== 2) || (s.mlieu== 5))
+ {
+ haz= hazard(1, 4);
+ if (haz== 3) parole(7, 9, 1);
+ }
+ touv[cx]= chr(num);
+ aniof(1,num);
+ }
+ cx= s.mlieu;
+ if (s.mlieu== 16) cx= 14;
+ crep= tabdon[aouvr+ (cx* 7)+ pred(integer,num)];
+ if (crep== 254) crep= 999;
+ }
+ else crep= 18;
+ }
+}
+
+/* overlay */ void tmettre()
+{
+ integer quel;
+ boolean entre;
+ phrase st;
+ str255 str_;
+ integer i,tay;
+
+ if (s.derobj== 0)
+ {
+ crep= 186;
+ return;
+ }
+ if (! syn) ecr3("mettre");
+ tfleche();
+ if (iesc) crep= 998;
+ if ((anyone) || (iesc)) return;
+ tcoord(8);
+ if (num!= 0)
+ {
+ crep= 999;
+ if (caff== 13)
+ {
+ if (num== 1)
+ {
+ if (s.iboul!= 0) crep= 188; else
+ {
+ s.iboul= s.derobj;
+ if (s.derobj== 141) aniof(1,7);
+ }
+ }
+ else
+ if (s.ibag!= 0) crep= 188; else
+ {
+ s.ibag= s.derobj;
+ if (s.derobj== 159) aniof(1,6);
+ }
+ }
+ if (caff== 14)
+ if (s.icave!=0) crep= 188; else
+ {
+ s.icave= s.derobj;
+ if (s.derobj== 151)
+ {
+ aniof(1,2);
+ aniof(1,1);
+ repon(2,165);
+ maivid();
+ parole(6, -9, 1);
+ quel= do_alert(stouinon,1);
+ if (quel==1) {
+ deline(582,st,tay);
+ i= do_alert(delig,1);
+ tesok=false;
+ entre= ques();
+ hide_mouse();
+ hirs();
+ dessine_rouleau();
+ clsf2();
+ clsf3();
+ show_mouse();
+ tinke();
+ pendule();
+ if (ipers!=0) affper(ipers);
+ else person();
+ menu_aff();
+ if (entre)
+ {
+ s.mlieu= 17;
+ tmlieu(17);
+ }
+ else
+ {
+ tmlieu(s.mlieu);
+ writepal(14);
+ dessin(0);
+ aniof(1,2);
+ aniof(1,1);
+ deline(577,st,tay);
+ i= do_alert(delig,1);
+ aniof(2,1);
+ crep= 166;
+ }
+ affrep();
+ }
+ else {
+ aniof(2,1);
+ crep= 166;
+ tesok=true;
+ }
+ return;
+ }
+ }
+ if (caff== 16)
+ if (s.icryp== 0) s.icryp= s.derobj; else crep= 188;
+ if (caff== 17)
+ if (s.ivier!=0) crep= 188; else
+ if (s.derobj== 143)
+ {
+ s.ivier= 143;
+ aniof(1,1);
+ }
+ else
+ {
+ crep= 1512;
+ tperd();
+ }
+ if (caff== 24)
+ if (s.ipuit!= 0) crep= 188; else
+ if ((s.derobj== 140) || (s.derobj== 120))
+ {
+ s.ipuit= s.derobj;
+ aniof(1,1);
+ }
+ else crep= 185;
+ if (crep!= 188) maivid();
+ }
+}
+
+/* overlay */ void ttourner()
+{
+ integer quel;
+
+ if (caff> 99)
+ {
+ crep= 149;
+ return;
+ }
+ if (! syn) ecr3("tourner");
+ tfleche();
+ if ((anyone) || (iesc)) return;
+ tcoord(9);
+ if (num!= 0)
+ {
+ crep= 997;
+ if ((s.mlieu== 13) && (s.ibag== 159) && (s.iboul== 141))
+ {
+ repon(2,167);
+ parole(7, 9, 1);
+ quel= do_alert(stouinon,1);
+ if (quel== 1) solu= true; else crep= 168;
+ }
+ if ((s.mlieu== 17) && (s.ivier== 143))
+ {
+ repon(2, 175);
+ clsf3();
+ parole(6, -9, 1);
+ quel= do_alert(stouinon,1);
+ if (quel== 1)
+ {
+ s.mlieu= 16;
+ affrep();
+ }
+ else crep= 176;
+ }
+ }
+}
+
+/* overlay */ void tcacher()
+{
+ if (! syn) ecr3("se cacher");
+ tfleche();
+ if (! (anyone) && ! (iesc))
+ {
+ tcoord(10);
+ if (num== 0) cache= false; else
+ {
+ cache= true;
+ crep= 999;
+ }
+ }
+}
+
+/* overlay */ void tattacher()
+{
+ if (s.derobj== 0) crep= 186; else
+ {
+ if (! syn) ecr3("attacher");
+ tfleche();
+ if (! (anyone) && ! (iesc))
+ {
+ tcoord(8);
+ crep= 997;
+ if ((num!= 0) && (s.mlieu== 24))
+ {
+ crep= 999;
+ if ((s.derobj== 120) || (s.derobj== 140))
+ {
+ s.ipuit= s.derobj;
+ aniof(1,1);
+ }
+ else crep= 185;
+ maivid();
+ }
+ }
+ }
+}
+
+/* overlay */ void tfermer()
+{
+ integer cx,chai;
+
+ if (! syn) ecr3("fermer");
+ if (caff< 26)
+ {
+ tfleche();
+ if (iesc) crep= 998;
+ if ((anyone) || (iesc)) return;
+ tcoord(7);
+ if (num!= 0)
+ {
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ } while (!((cx> 6) || (num== ord(touv[cx]))));
+ if (num== ord(touv[cx]))
+ {
+ aniof(2,num);
+ crep= 998;
+ touv[cx]= chr(0);
+ iouv= iouv- 1;
+ if (iouv< 0) iouv= 0;
+ chai= 9999;
+ rechai(chai);
+ if (mchai== chai) mchai= 0;
+ }
+ else crep= 187;
+ }
+ }
+ if (caff== 26) crep= 999;
+}
+
+/* overlay */ void tfrapper()
+{
+ integer l,p,haz;
+
+ if (! syn) ecr3("frapper");
+ if (s.mlieu== 15)
+ {
+ l= do_alert("[1][ | Avant, utilisez le menu DEP...][ok]",1);
+ return;
+ }
+ if (s.mlieu< 25)
+ {
+ tfleche();
+ if (! (anyone) && ! (iesc))
+ if ((s.mlieu< 19) && (s.mlieu!= 15)) crep= 133; else crep= 997;
+ return;
+ }
+ if (s.mlieu== 26)
+ {
+ haz= (hazard(0, 8))- 4;
+ parole(11, haz, 1);
+ ecfren(p,haz,s.conf,ment);
+ l= ment;
+ if (l!= 0)
+ if (p!= -500)
+ {
+ if (haz> p) crep= 190; else
+ {
+ becfren(l);
+ frap();
+ }
+ }
+ else frap();
+ if (ment== 8) crep= 190;
+ }
+}
+
+/* overlay */ void tposer()
+{
+ integer cx,chai;
+
+ if (! syn) ecr3("poser");
+ if (s.derobj== 0) crep= 186; else
+ {
+ if (caff> 99)
+ {
+ crep= 999;
+ ajchai();
+ if (crep!= 192) maivid();
+ return;
+ }
+ tfleche();
+ if ((anyone) || (iesc)) return;
+ tcoord(7);
+ crep= 124;
+ if (num!= 0)
+ {
+ rechai(chai);
+ if (chai== 0) crep= 997; else
+ {
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ } while (!((cx> 6) || (num== ord(touv[cx]))));
+ if (num!= ord(touv[cx])) crep= 187; else
+ {
+ mchai= chai;
+ crep= 999;
+ }
+ }
+ }
+ else
+ {
+ tcoord(8);
+ if (num!= 0)
+ {
+ crep= 998;
+ if (caff== 2)
+ if (s.iloic!= 0) crep= 188; else s.iloic= s.derobj;
+ if (caff== 13)
+ {
+ if (num== 1)
+ {
+ if (s.iboul!= 0) crep= 188; else s.iboul= s.derobj;
+ }
+ else
+ if (s.ibag!= 0) crep= 188; else s.ibag= s.derobj;
+ }
+ if (caff== 16)
+ if (s.icryp!= 0) crep= 188; else s.icryp= s.derobj;
+ if (caff== 24) crep= 185;
+ if ((caff== 14) || (caff== 17)) crep= 124;
+ }
+ else
+ {
+ crep= 124;
+ if (caff== 24)
+ {
+ tcoord(5);
+ if (num!= 0) crep= 185;
+ }
+ }
+ }
+ if (caff== 23) crep= 185;
+ if ((crep== 999) || (crep== 185) || (crep== 998))
+ {
+ if (crep== 999) ajchai();
+ if (crep!= 192) maivid();
+ }
+ }
+}
+
+/* overlay */ void tecouter()
+{
+ integer l,p,haz,j,h,m;
+
+ if (s.mlieu!= 26) crep= 101; else
+ {
+ if (ipers!= 0) s.conf= s.conf+ 1;
+ ecfren(p,haz,s.conf,ment);
+ l= ment;
+ if (l!= 0)
+ if (p!= -500)
+ {
+ if (haz> p) crep= 101; else
+ {
+ becfren(l);
+ calch(j,h,m);
+ haz= hazard(1,100);
+ if ((h>= 0) && (h< 8))
+ {
+ if (haz> 30) crep= 101; else crep= 178;
+ }
+ else
+ if (haz> 70) crep= 101; else crep= 178;
+ }
+ }
+ else crep= 178;
+ }
+}
+
+/* overlay */ void tmanger()
+{
+ integer j,h,m;
+
+ if ((s.mlieu> 15) && (s.mlieu< 26))
+ crep= 148;
+ else
+ {
+ tsort();
+ s.mlieu= 10;
+ caff= 10;
+ debloc(s.mlieu);
+ tmlieu(s.mlieu);
+ calch(j,h,m);
+ if ((h== 12) || (h== 13) || (h== 19))
+ {
+ s.conf= s.conf- (s.conf / 7);
+ if (h== 12)
+ if (m== 0) h= 4; else h= 3;
+ if ((h== 13) || (h== 19))
+ if (m== 0) h= 2; else h= 1;
+ jh= jh+ h;
+ crep= 135;
+ tinke();
+ }
+ else crep= 134;
+ }
+}
+
+/* overlay */ void tentrer()
+{
+ integer x, z;
+
+ if ((s.mlieu== 21) || (s.mlieu== 22))
+ {
+ t1sama();
+ tmlieu(s.mlieu);
+ }
+ else
+ if (s.mlieu== 15) aldepl(); else
+ if (ment== 0) crep= 997; else
+ {
+ if ((ment== 9) && (s.derobj!= 136))
+ {
+ crep= 189;
+ s.teauto[8]= '*';
+ }
+ else
+ {
+ if (! blo) t11(ment, z);
+ if (z!= 0)
+ {
+ if ((ment== 3) || (ment== 7)) crep= 179; else
+ {
+ x= (hazard(0, 10))- 5;
+ parole(7, x, 1);
+ aniof(1,1);
+/* tkey(5,32000);*/
+ tip(z,x);
+ s.conf= s.conf+ 1;
+ s.mlieu= 15;
+ msg[3]= discut;
+ msg[4]= disc[x];
+ syn= true;
+ if (ment== 9)
+ {
+ col= true;
+ caff= 70;
+ afdes(0);
+ repon(2,caff);
+ }
+ else col= false;
+ debloc(ment);
+ ment= 0;
+ }
+ }
+ else
+ {
+ x= (hazard(0, 10))- 5;
+ parole(7, x, 1);
+ aniof(1,1);
+/* tkey(1,32000);*/
+ s.mlieu= ment;
+ affrep();
+ debloc(s.mlieu);
+ tmlieu(s.mlieu);
+ ment= 0;
+ mpers= 0;
+ ipers= 0;
+ }
+ }
+ }
+}
+
+/* overlay */ void tdormir()
+{
+ const char m1[] = "D‚sirez-vous vous r‚veiller?";
+ integer z,j,h,m,quel;
+
+ if ((s.mlieu> 15) && (s.mlieu< 26))
+ {
+ crep= 148;
+ return;
+ }
+ if (s.mlieu != 0)
+ {
+ tsort();
+ s.mlieu= 0;
+ affrep();
+ afdes(0);
+ debloc(s.mlieu);
+ tmlieu(s.mlieu);
+ }
+ clsf3();
+ clsf2();
+ ecrf2();
+ ecr2(m1);
+ calch(j,h,m);
+ do {
+ if (h< 8)
+ {
+ s.conf= s.conf- (s.conf / 20);
+ z= (7- h)* 2;
+ if (m== 30) z= z- 1;
+ jh= jh+ z;
+ h= 7;
+ }
+ jh= jh+ 2;
+ h= h+ 1;
+ if (h> 23) h= 0;
+ tinke();
+ quel= do_alert(stouinon,1);
+ anyone= false;
+ } while (!(quel== 1));
+ crep= 998;
+ num= 0;
+}
+
+/* overlay */ void tdefoncer()
+{
+ if (! syn) ecr3("d‚foncer");
+ if (caff< 25) tfleche();
+ if ((! anyone) && (! iesc))
+ if (s.mlieu!= 26) crep= 997; else
+ {
+ crep= 143;
+ s.conf= s.conf+ 2;
+ }
+}
+
+/* overlay */ void tsortir()
+{
+ integer lx;
+
+ tsort();
+ crep= 0;
+ if ((s.mlieu== 19) || (s.mlieu== 21) || (s.mlieu== 22)
+ || (s.mlieu== 24)) crep= 997; else
+ {
+ if ((s.mlieu< 16) || (s.mlieu== 26)) lx= 10;
+ if ((s.mlieu== 10) || (s.mlieu== 20)) lx= 21;
+ if ((s.mlieu< 10) || (s.mlieu== 13)) lx= 15;
+ if (s.mlieu== 16)
+ {
+ lx= 17;
+ crep= 176;
+ }
+ if (s.mlieu== 17) t23coul(lx);
+ if (s.mlieu== 23) lx= 24;
+ if (crep!= 997) s.mlieu= lx;
+ caff= lx;
+ if (crep== 0) crep= lx;
+ debloc(lx);
+ tmlieu(lx);
+ }
+}
+
+/* overlay */ void tattendre()
+{
+ integer quel;
+
+ mpers= 0;
+ clsf3();
+ do {
+ jh= jh+ 1;
+ tinke();
+ if (! blo) t11(s.mlieu, quel);
+ if ((ipers!= 0) && (mpers== 0))
+ {
+ crep= 998;
+ if ((s.mlieu== 13) || (s.mlieu== 14)) cavegre();
+ if ((s.mlieu> 0) && (s.mlieu< 10)) anyone= true;
+ mpers= ipers;
+ if (! anyone) tinke();
+ return;
+ }
+ repon(2,102);
+ quel= do_alert(stouinon,1);
+ } while (!(quel== 2));
+ crep= 998;
+ if (! anyone) tinke();
+}
+
+/* overlay */ void tsonder()
+{
+ if (! syn) ecr3("sonder");
+ if (caff< 27)
+ {
+ tfleche();
+ if (! (anyone) && (! iesc)) crep= 145;
+ num= 0;
+ }
+}
+
+/* overlay */ void tparler()
+
+{
+ array<1,46,boolean> te;
+ integer ix, cy, cx, max, haz, suj, co,lig,icm,
+ i, tay, choi, x, y, c;
+ char tou;
+ array<1,46,varying_string<40> > lib;
+ phrase st;
+ boolean f;
+
+
+
+ finfouil();
+ if (col) suj= 128; else
+ {
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ } while (!(disc[cx]== msg[4]));
+ caff= 69+ cx;
+ afdes(0);
+ repon(2,caff);
+ suj= caff+ 60;
+ }
+ tkey1(false);
+ mennor();
+ hide_mouse();
+ hirs();
+ premtet();
+ sparl(0,suj);
+ hirs();
+ for( ix= 1; ix <= 46; ix ++) te[ix]= false;
+ for( ix=1; ix <= 45; ix ++)
+ {
+ deline(ix+c_tparler,st,tay);
+ lib[ix]= delig;
+ for( i=tay; i <= 40; i ++) lib[ix]=lib[ix]+' ';
+ }
+ lib[46]=lib[45];
+ lib[45]=' ';
+ show_mouse();
+ do {
+ choi= 0;
+ icm= 0;
+ co= 0;
+ lig= 0;
+ do {
+ icm= succ(integer, icm );
+ putxy(co,lig);
+ if (s.teauto[icm]=='*')
+ if (te[icm]) writetp(lib[icm],1);
+ else writetp(lib[icm],0);
+ if (icm==23) {
+ lig= 0;
+ co= 320;
+ }
+ else lig= lig + 8;
+ } while (!(icm==42));
+ putxy(320,176);
+ writetp(lib[46],0);
+ tou= '\0';
+ do {
+ mov_mouse(f,tou);
+/* if keypressed then read(kbd,tou);*/
+ read_pos_mouse(x,y,c);
+ x= x *(3-res);
+ if (x>319) cx= 41; else cx= 1;
+ cy= succ(integer,(cardinal)y >> 3); /* 0-199 => 1-25 */
+ if ((cy>23) || ((cx==41) && (set::of(range(20,22), eos).has(cy))))
+ {
+ if (choi!=0)
+ {
+ lig= ((choi-1) % 23) << 3;
+ if (choi>23) co= 320; else co= 0;
+ putxy(co,lig);
+ if (te[choi]) writetp(lib[choi],0);
+ else writetp(lib[choi],1);
+ te[choi]= ! te[choi];
+ choi= 0;
+ }
+ }
+ else {
+ ix= cy;
+ if (cx==41) ix= ix+23;
+ if (ix!=choi)
+ {
+ if (choi!=0)
+ {
+ lig= ((choi-1) % 23) << 3;
+ if (choi>23) co= 320; else co= 0;
+ putxy(co,lig);
+ if (te[choi]) writetp(lib[choi],0);
+ else writetp(lib[choi],1);
+ te[choi]= ! te[choi];
+ }
+ if ((s.teauto[ix]=='*') || (ix==46))
+ {
+ lig= ((ix-1) % 23) << 3;
+ if (ix>23) co= 320; else co= 0;
+ putxy(co,lig);
+ if (te[ix]) writetp(lib[ix],0);
+ else writetp(lib[ix],1);
+ te[ix]= ! te[ix];
+ choi= ix;
+ }
+ else choi= 0;
+ }
+ }
+ } while (!((tou=='\15') || ( ((c!=0) || clic) && (choi!=0))));
+ clic=false;
+ if (choi!=46)
+ {
+ ix= choi-1;
+ if (col)
+ {
+ col= false;
+ s.mlieu= 15;
+ if (iouv> 0) max= 8; else max= 4;
+ haz= hazard(1,max);
+ if (haz== 2) suj= 129; else
+ {
+ suj= 138;
+ s.conf= s.conf+ (3* (s.conf / 10));
+ }
+ }
+ else
+ if (nbrep[caff- 69]< nbrepm[caff- 69])
+ {
+ suj= tabdon[arep+ (ix << 3)+ (caff- 70)];
+ s.conf= s.conf+ tabdon[arcf+ ix];
+ nbrep[caff- 69]= nbrep[caff- 69]+ 1;
+ }
+ else
+ {
+ s.conf= s.conf+ 3;
+ suj= 139;
+ }
+ hide_mouse();
+ hirs();
+ premtet();
+ sparl(0, suj);
+ show_mouse();
+ if ((suj== 84) || (suj== 86))
+ {
+ s.pourc[5]= '*';
+ s.teauto[7]= '*';
+ }
+ if ((suj== 106) || (suj== 108) || (suj== 94))
+ {
+ for( ix= 29; ix <= 31; ix ++) s.teauto[ix]= '*';
+ s.pourc[7]= '*';
+ }
+ if (suj== 70)
+ {
+ s.pourc[8]= '*';
+ s.teauto[32]= '*';
+ }
+ hide_mouse();
+ hirs();
+ show_mouse();
+ }
+ } while (!((choi== 46) || (suj== 138)));
+ if (col)
+ {
+ s.conf= s.conf+ (3* (s.conf / 10));
+ hide_mouse();
+ hirs();
+ premtet();
+ sparl(0, 138);
+ show_mouse();
+ col= false;
+ s.mlieu= 15;
+ }
+ ctrm= 0;
+ hide_mouse();
+ hirs();
+ dessine_rouleau();
+ show_mouse();
+ affper(ipers);
+ tinke();
+ pendule();
+ affrep();
+/* chech;*/
+ tmlieu(s.mlieu);
+ clsf3();
+}
+
+/* overlay */ void tsentir()
+{
+ crep= 119;
+ if (caff< 26)
+ {
+ if (! syn) ecr3("sentir");
+ tfleche();
+ if (! (anyone) && ! (iesc))
+ if (caff== 16) crep= 153;
+ }
+ else
+ if (caff== 123) crep= 110;
+ num= 0;
+}
+
+/* overlay */ void tgratter()
+{
+ crep= 155;
+ if (caff< 27)
+ {
+ if (! syn) ecr3("gratter");
+ tfleche();
+ }
+ num= 0;
+}
+
+/* NIVEAU 2 */
+/* overlay */ void tmaj1() /* Le jeu est termin‚ !!! */
+{
+ arret= true;
+ tlu(13,152);
+ maivid();
+ clsf1();
+ clsf2();
+ clsf3();
+ repon(9,1509);
+ tkey1(false);
+ hide_mouse();
+ caff= 70;
+ taffich();
+ hirs();
+ premtet();
+ sparl(0,141);
+ show_mouse();
+ clsf1();
+ repon(9,1509);
+ repon(2,142);
+ tkey1(false);
+ caff= 32;
+ afdes(0);
+ repon(6,34);
+ repon(2,35);
+ musique(0);
+ tkey1(false);
+ messint(2036);
+ tkey1(false);
+ inzon();
+}
+
+/* overlay */ void tencore() /* Perdu !!! */
+{
+ integer quel;
+
+ clsf2();
+ musique(0);
+ tkey1(false);
+ maivid();
+ inzon();
+ dprog();
+ vh= 10;
+ vm= 0;
+ vj= 0;
+ min= 0;
+ heu= 10;
+ jou= 0;
+ repon(2,180);
+ quel= do_alert(stouinon,1);
+ arret= (quel!=1);
+}
diff --git a/engines/mortevielle/alert.h b/engines/mortevielle/alert.h
new file mode 100644
index 0000000000..c3a45fe529
--- /dev/null
+++ b/engines/mortevielle/alert.h
@@ -0,0 +1,214 @@
+/* overlay */ integer do_alert(str255 str_, integer n);
+
+
+const integer nligne = 7;
+const matrix<1,2,1,3,integer> coord
+ = {{ {{150, 72, 103}},
+ {{143, 107, 183}} }};
+
+
+
+static void decod(str255 s, integer& nbc,integer& nbl,integer& col, str255& c, str30& cs)
+ {
+ integer i,k;
+ boolean v;
+
+ val(s[2],nbc,i);
+ c= "";
+ nbl= 0; i= 5; k= 0;
+ v=true; col=0;
+
+ while (s[i]!=']')
+ {
+ c=c+s[i];
+ if ((s[i]=='|') || (s[i+1]==']'))
+ {
+ if (k>col) col=k;
+ k= 0;
+ nbl=nbl+1;
+ }
+ else if (s[i]!=' ') v=false;
+ i=i+1;
+ k=k+1;
+ }
+ if (v) {
+ c="";
+ col=20;
+ }
+ else {
+ c=c+']';
+ col=col+6;
+ }
+ i=i+1;
+ cs=copy(s,i,30);
+ if (res==2) col= col*6;
+ else col= col*10;
+ }
+
+
+
+static void posit(integer ji, integer& coldep, integer& esp)
+ {
+ putxy(coldep + (40+esp) *pred(integer,ji),98);
+ }
+
+
+
+static void fait_boite(integer lidep,integer nli,integer tx)
+ {
+ integer x,y,xx,yy;
+
+ if (tx>640) tx=640;
+ x= 320- ((cardinal)tx >> 1);
+ y=pred(integer,lidep) << 3;
+ xx=x+ tx;
+ yy=y + (nli << 3);
+ box(15,gd,x,y,xx,yy,255);
+ box(0,gd,x,y+2,xx,y+4,255);
+ box(0,gd,x,yy-4,xx,yy-2,255);
+ }
+
+
+
+static void fait_choix(str30 c, integer& coldep, integer& nbcase, array<1,2,varying_string<3> >& s, integer& esp)
+ {
+ integer i,l,x;
+ char ch;
+
+ i=1;
+ x=coldep;
+ for( l=1; l <= nbcase; l ++)
+ {
+ s[l]="";
+ do {
+ i=i+1;
+ ch=c[i];
+ s[l]=s[l]+ch;
+ } while (!(c[i+1]==']'));
+ i=i+2;
+ while (length(s[l])<3) s[l]=s[l]+' ';
+ putxy(x,98);
+ writeg(string(' ')+s[l]+' ',0);
+ x= x+esp+40;
+ }
+ }
+
+ integer do_alert(str255 str_, integer n)
+{
+ integer coldep,esp,i,l,nbcase,quoi,ix;
+ str255 st, chaine;
+ matrix<1,2,1,2,integer> limit;
+ char c,dumi;
+ array<1,2,varying_string<3> > s;
+ integer cx,cy,cd,nbcol,nblig;
+ boolean touch,newaff,test,test1,test2,test3,dum;
+ str30 cas;
+
+
+ /*debug('** do_alert **');*/
+ integer do_alert_result;
+ hide_mouse();
+ while (keypressed()) input >> kbd >> dumi;
+ clic=false;
+ decod(str_,nbcase,nblig,nbcol,chaine,cas);
+ sauvecr(50,succ(integer,nligne) << 4);
+
+ i=0;
+ if (chaine=="")
+ {
+ fait_boite(10,5,nbcol);
+ }
+ else
+ {
+ fait_boite(8,7,nbcol);
+ i=0;
+ ywhere=70;
+ do {
+ cx= 320;
+ st= "";
+ while (! (set::of('\174','\135', eos).has(chaine[i+1])))
+ {
+ i=i+1;
+ st=st+chaine[i];
+ if (res==2) cx=cx-3;
+ else cx=cx-5;
+ }
+ putxy(cx,ywhere);
+ ywhere=ywhere+6;
+ writeg(st,4);
+ i=i+1;
+ } while (!(chaine[i]==']'));
+ }
+ if (nbcase==1) esp= nbcol- 40;
+ else esp= (cardinal)(nbcol-nbcase*40) >> 1;
+ coldep=320-((cardinal)nbcol >> 1)+((cardinal)esp >> 1);
+ fait_choix(cas, coldep, nbcase, s, esp);
+ limit[1][1]=((cardinal)(coldep) >> 1)*res;
+ limit[1][2]=limit[1][1]+40;
+ if (nbcase==1)
+ {
+ limit[2][1]=limit[2][2];
+ }
+ else
+ {
+ limit[2][1]=((cardinal)(320+((cardinal)esp >> 1)) >> 1)*res;
+ limit[2][2]=(limit[2][1])+40;
+ }
+ show_mouse();
+ quoi=0;
+ dum=false;
+ do {
+ dumi='\377';
+ mov_mouse(dum,dumi);
+ cx= x_s;
+ cy= y_s;
+ test=(cy>95) && (cy<105);
+ newaff=false;
+ if (test)
+ {
+ test1=(cx>limit[1][1]) && (cx<limit[1][2]);
+ test2=test1;
+ if (nbcase>1) test2= test1 || ((cx>limit[2][1]) && (cx<limit[2][2]));
+ if (test2)
+ {
+ newaff=true;
+ if (test1) ix=1;
+ else ix=2;
+ if (ix!=quoi)
+ {
+ hide_mouse();
+ if (quoi!=0)
+ {
+ posit(quoi, coldep, esp);
+ writeg(string(' ')+s[quoi]+' ',0);
+ }
+ posit(ix, coldep, esp);
+ writeg(string(' ')+s[ix]+' ',1);
+ quoi=ix;
+ show_mouse();
+ }
+ }
+ }
+ if ((quoi!=0) && ! newaff)
+ {
+ hide_mouse();
+ posit(quoi, coldep, esp);
+ writeg(string(' ')+s[quoi]+' ',0);
+ quoi=0;
+ show_mouse();
+ }
+ test3=(cy>95) && (cy<105) && (((cx>limit[1][1]) && (cx<limit[1][2]))
+ || ((cx>limit[2][1]) && (cx<limit[2][2])));
+ } while (!clic);
+ clic=false;
+ hide_mouse();
+ if (! test3) {
+ quoi=n;
+ posit(n, coldep, esp);
+ writeg(string(' ')+s[n]+' ',1);
+ }
+ charecr(50,succ(integer,nligne) << 4);
+ show_mouse();
+ do_alert_result=quoi;
+ return do_alert_result;
+}
diff --git a/engines/mortevielle/boite.h b/engines/mortevielle/boite.h
new file mode 100644
index 0000000000..0819490bfc
--- /dev/null
+++ b/engines/mortevielle/boite.h
@@ -0,0 +1,30 @@
+void boite(integer x,integer y,integer dx,integer dy,integer coul)
+ {
+ integer i;
+ integer xi,yi,xo,yo;
+
+ /* debug('boite'); */
+ hide_mouse();
+ if (res==1)
+ {
+ x= (cardinal)x >> 1;
+ dx= (cardinal)dx >> 1;
+ }
+ xi=x; yi=y; xo=x; yo=y;
+ for( i=0; i <= dx+dy; i ++)
+ {
+ putpix(gd,xi,yi,coul);
+ if (xi==x+dx) {
+ if (gd!=cga) putpix(gd,pred(integer,xi),yi,coul);
+ yi=succ(integer,yi);
+ }
+ else xi=succ(integer,xi);
+ putpix(gd,xo,yo,coul);
+ if (yo==y+dy) xo=succ(integer,xo);
+ else {
+ if (gd!=cga) putpix(gd,succ(integer,xo),yo,coul);
+ yo=succ(integer,yo);
+ }
+ }
+ show_mouse();
+ }
diff --git a/engines/mortevielle/disk.h b/engines/mortevielle/disk.h
new file mode 100644
index 0000000000..28a2dbe6a5
--- /dev/null
+++ b/engines/mortevielle/disk.h
@@ -0,0 +1,80 @@
+
+void dem1()
+{
+ untyped_file f;
+ integer k;
+
+ /* -- demande de disk 1 -- */
+ assign(f,"mort.005");
+ /*$i-*/
+ k=ioresult;
+ reset(f);
+ while (ioresult!=0)
+ {
+ show_mouse();
+ k= do_alert(al_mess,1);
+ hide_mouse();
+ reset(f);
+ }
+ close(f);
+}
+
+void takesav(integer n)
+{
+ untyped_file f;
+ integer i;
+ varying_string<10> st;
+
+ dem1();
+ /* -- chargement du fichier 'sauve#n.mor' -- */
+ st= string("sav")+chr(n+48)+".mor";
+ assign(f,st);
+ reset(f,497);
+ blockread(f,s1,1);
+ if (ioresult!=0)
+ {
+ i=do_alert(err_mess,1);
+ exit(0);
+ }
+ s=s1;
+ for( i=0; i <= 389; i ++) tabdon[i+acha]=bufcha[i];
+ close(f);
+}
+
+void ld_game(integer n)
+{
+ hide_mouse();
+ maivid();
+ takesav(n);
+ /* -- disquette 2 -- */
+ dem2();
+ /* -- mises en place -- */
+ theure();
+ dprog();
+ antegame();
+ show_mouse();
+}
+
+void sv_game(integer n)
+{
+ untyped_file f;
+ integer i;
+
+ hide_mouse();
+ tmaj3();
+ dem1();
+ /* -- sauvegarde du fichier 'sauve#n.mor' -- */
+ for( i=0; i <= 389; i ++) bufcha[i]=tabdon[i+acha];
+ s1=s;
+ if (s1.mlieu== 26) s1.mlieu= 15;
+ assign(f,string("sav")+chr(n+48)+".mor");
+ rewrite(f,497);
+ blockwrite(f,s1,1);
+ close(f);
+ dem2();
+ show_mouse();
+}
+
+
+
+
diff --git a/engines/mortevielle/droite.h b/engines/mortevielle/droite.h
new file mode 100644
index 0000000000..7dd029e2ec
--- /dev/null
+++ b/engines/mortevielle/droite.h
@@ -0,0 +1,35 @@
+void droite( integer x, integer y, integer xx, integer yy, integer coul )
+ {
+ integer step,i;
+ real a,b;
+ real xr,yr,xro,yro;
+
+ xr=x; yr=y; xro=xx; yro=yy;
+ /*writeln(le_file,'(',x:4,',',y:4,') ==> (',xx:4,',',yy:4,')');*/
+ if (abs(y-yy) > abs(x-xx))
+ {
+ a= (real)((x-xx)) / (y-yy);
+ b= ( yr*xro - yro*xr) / (y-yy);
+ i=y;
+ if (y>yy) step=-1;
+ else step=1;
+ do {
+ putpix(gd, trunc(a*i+b), i, coul);
+ i=i+step;
+ } while (!(i==yy));
+ /*writeln(le_file,'X == ',a:3:3,' * Y + ',b:3:3);*/
+ }
+ else
+ {
+ a= (real)((y-yy)) / (x-xx);
+ b= ((yro*xr) - (yr*xro)) / (x-xx);
+ i=x;
+ if (x>xx) step=-1;
+ else step=1;
+ do {
+ putpix(gd,i, trunc(a*i+b), coul);
+ i=i+step;
+ } while (!(i==xx));
+ /*writeln(le_file,'Y == ',a:3:3,' * X + ',b:3:3);*/
+ }
+ } \ No newline at end of file
diff --git a/engines/mortevielle/keyboard.h b/engines/mortevielle/keyboard.h
new file mode 100644
index 0000000000..9f8423a41f
--- /dev/null
+++ b/engines/mortevielle/keyboard.h
@@ -0,0 +1,59 @@
+char readkey1()
+ {
+ char c;
+
+ char readkey1_result;
+ input >> kbd >> c;
+ readkey1_result= c;
+ return readkey1_result;
+ }
+
+integer testou()
+ {
+ char ch;
+
+ integer testou_result;
+ input >> kbd >> ch;
+ switch (ch) {
+ case '\23' : sonoff= ! sonoff; break;
+ case '\1':
+ case '\3':
+ case '\5' : {
+ newgd= (cardinal)pred(integer,ord(ch)) >> 1;
+ testou_result= 61;
+ return testou_result;
+ }
+ break;
+ case '\10' : {
+ newgd= her;
+ testou_result= 61;
+ return testou_result;
+ }
+ break;
+ case '\24' : {
+ newgd= tan;
+ testou_result= 61;
+ return testou_result;
+ }
+ break;
+ case '\26' : if (set::of(1,2, eos).has(c_zzz))
+ {
+ zzuul(adcfiec+161,0,1644);
+ c_zzz=succ(integer,c_zzz);
+ testou_result=61;
+ return testou_result;
+ }
+ break;
+ case '\33' : if (keypressed()) input >> kbd >> ch; break;
+ }
+ testou_result=ord(ch);
+ return testou_result;
+ }
+
+void teskbd()
+ {
+ integer dum;
+
+ if (keypressed()) dum=testou();
+ }
+
diff --git a/engines/mortevielle/level15.h b/engines/mortevielle/level15.h
new file mode 100644
index 0000000000..be92e8dca2
--- /dev/null
+++ b/engines/mortevielle/level15.h
@@ -0,0 +1,186 @@
+
+/* NIVEAU 15 */
+void copcha()
+{
+ integer i;
+
+ i= acha;
+ do {
+ tabdon[i]=tabdon[i+390];
+ i=succ(integer,i);
+ } while (!(i==acha +390));
+}
+
+boolean dans_rect( rectangle r )
+ {
+ integer x, y, c;
+
+ boolean dans_rect_result;
+ read_pos_mouse(x,y,c);
+ if ((x>r.x1) &&
+ (x<r.x2) &&
+ (y>r.y1) &&
+ (y<r.y2)) dans_rect_result= true;
+ else dans_rect_result= false;
+ return dans_rect_result;
+ }
+
+void outbloc(integer n, pattern p, t_nhom pal)
+ {
+ integer i,j,ad;
+
+ ad=n*404+0xd700;
+ {
+ memw[0x6000+ad]= p.tax;
+ memw[0x6000+ad+2]= p.tay;
+ ad=ad+4;
+ for( i=1; i <= p.tax; i ++)
+ for( j=1; j <= p.tay; j ++)
+ mem[0x6000+ad+pred(integer,j)*p.tax+pred(integer,i)]= pal[n].hom[p.des[i][j]];
+ }
+ }
+
+
+void writepal(integer n)
+ {
+ integer i;
+ t_nhom pal;
+
+
+ switch (gd) {
+ case tan:
+ case ega:
+ case ams : for( i=1; i <= 16; i ++)
+ {
+ mem[0x7000+2*i]= tabpal[n][i].x;
+ mem[0x7000+succ(integer,2*i)]= tabpal[n][i].y;
+ }
+ break;
+ case cga : {
+ pal= palcga[n].a;
+ if (n<89) palette(palcga[n].p);
+ for( i=0; i <= 15; i ++) outbloc(i, tpt[pal[i].n],pal);
+ }
+ break;
+ }
+ }
+
+
+void pictout(integer seg,integer dep,integer x,integer y)
+ {
+ decomp(seg,dep);
+ if (gd==her)
+ {
+ mem[0x7000+2]=0;
+ mem[0x7000+32]=15;
+ }
+ if ((caff!=51) && (memw[0x7000+0x4138]>0x100)) memw[0x7000+0x4138]=0x100;
+ afff(gd,seg,dep,x,y);
+ }
+
+void putxy(integer x,integer y)
+{
+ xwhere=x;
+ ywhere=y;
+}
+/*
+function calad(x,y:integer):integer;
+ begin
+ calad:=pred(x)+320*pred(y)
+ end;
+ */
+void sauvecr(integer y,integer dy)
+ {
+ hide_mouse();
+ s_sauv(gd,y,dy);
+ show_mouse();
+ }
+
+void charecr(integer y,integer dy)
+ {
+ hide_mouse();
+ s_char(gd,y,dy);
+ show_mouse();
+ }
+/*
+function peek(ad:integer):integer;
+begin
+ peek:=tabdon[ad];
+end;
+
+function peekw(ad:integer):integer;
+begin
+ peekw:=tabdon[ad] shl 8+tabdon[succ(ad)];
+end;
+
+function peekl(ad:integer):real;
+begin
+ peekl:=tabdon[ad+3]+tabdon[ad+2] shl 8;
+end;
+
+
+procedure poke (ad,n:integer);
+begin
+ tabdon[ad]:=lo(n);
+end;
+ */
+
+void adzon()
+ {
+ untyped_file f;
+ file<byte> g;
+ byte a;
+ integer i;
+
+ assign(f,"don.mor");
+ reset(f,256);
+ blockread(f,tabdon,7);
+ close(f);
+ assign(f,"bmor.mor");
+ reset(f,1916);
+ blockread(f,tabdon[fleche],1);
+ /*i:=fleche;
+ repeat
+ read(g,a);
+ tabdon[i]:=a;
+ i:=succ(i);
+ until i=fleche + 1916;*/
+ close(f);
+ assign(f,"dec.mor");
+ reset(f,1664);
+ blockread(f,mem[0x73a2+0],1);
+ /*i:=0;
+ repeat
+ read(g,a);
+ mem[$73A2:i]:=a;
+ i:=succ(i);
+ until eof(g);*/
+ close(f);
+ }
+
+integer animof (integer ouf,integer num)
+ {
+ integer nani, aux;
+
+ integer animof_result;
+ nani= mem[adani+1];
+ aux= num;
+ if (ouf!=1) aux= aux+nani;
+ animof_result=(nani << 2) + 2+swap(memw[adani+ (aux << 1)]);
+ /*aux:= nani shl 2 + 2;
+ if ouf=1 then aux:= aux+ swap(memw[adani: num shl 1])
+ else aux:= aux+ swap(memw[adani: (nani+num) shl 1]);
+ animof:=aux;*/
+ return animof_result;
+ }
+
+/*procedure affgd(offs,dep,x,y:integer);
+begin
+ case Gd of
+ Ams : affams(offs,dep,x,y);
+ Cga : affcga(offs,dep,x,y);
+ Ega : affega(offs,dep,x,y);
+ Her : affher(offs,dep,x,y);
+ Tan : afftan(offs,dep,x,y);
+ end;
+end;*/
diff --git a/engines/mortevielle/menu.h b/engines/mortevielle/menu.h
new file mode 100644
index 0000000000..9256182280
--- /dev/null
+++ b/engines/mortevielle/menu.h
@@ -0,0 +1,306 @@
+/* NIVEAU 14*/
+
+/* overlay */ void menut(integer no, str30 nom)
+ {
+ byte h,l;
+ str30 s;
+
+
+ /* debug('menut'); */
+ h=hi(no);
+ l=lo(no);
+ s=nom;
+ if (! tesok)
+ {
+ clrscr;
+ exit(0);
+ }
+ while (length(s)<30) s=s+' ';
+ switch (h) {
+ case invent : if (l!=7) inv[l]= string(' ')+s; break;
+ case depla : dep[l]= s; break;
+ case action : act[l]= s; break;
+ case saction : self_[l]= s; break;
+ case discut : dis[l]= s; break;
+ }
+ }
+
+/* overlay */ void menu_disable(integer no)
+ {
+ byte h,l;
+
+ /* debug('menu_disable'); */
+ h=hi(no);
+ l=lo(no);
+ switch (h) {
+ case invent : {
+ if (l>6) {
+ inv[l][1]='<';
+ inv[l][22]='>';
+ }
+ else inv[l][1]='*';
+ }
+ break;
+ case depla : dep[l][1]='*'; break;
+ case action : act[l][1]='*'; break;
+ case saction : self_[l][1]='*'; break;
+ case discut : dis[l][1]='*'; break;
+ }
+ }
+
+/* overlay */ void menu_enable(integer no)
+ {
+ byte h,l;
+
+ /* debug('menu_disable'); */
+ h=hi(no);
+ l=lo(no);
+ switch (h) {
+ case invent : {
+ inv[l][1]=' ';
+ inv[l][22]=' ';
+ }
+ break;
+ case depla : dep[l][1]=' '; break;
+ case action : act[l][1]=' '; break;
+ case saction : {
+ self_[l][1]=' ';
+ self_[l][1]=' ';
+ }
+ break;
+ case discut : dis[l][1]=' '; break;
+ }
+ }
+
+void menu_aff()
+ {
+ integer ind_tabl,k,col;
+ char c;
+ integer pt,x,y,color,msk,
+ num_letr;
+
+ /* debug('menu_aff'); */
+ hide_mouse();
+ /*if not tesok then
+ begin
+ clrscr;
+ halt;
+ end;*/
+ box( 7, gd, 0,0, 639,10, 255);
+ col= 28*res;
+ if (gd == cga) color=1;
+ else color=9;
+ num_letr=0;
+ do { /* lettre par lettre */
+ num_letr= num_letr +1;
+ ind_tabl=0;
+ y= 1;
+ do { /* colonne par colonne */
+ k=0;
+ x= col;
+ do { /* ligne par ligne */
+ msk=0x80;
+ for( pt=0; pt <= 7; pt ++)
+ {
+ if ((lettres[num_letr][ind_tabl] & msk)!=0)
+ {
+ putpix(gd,x+1,y+1,0);
+ putpix(gd,x,y+1,0);
+ putpix(gd,x,y,color);
+ }
+ msk= (cardinal)msk >> 1;
+ x=x +1;
+ }
+ ind_tabl=succ(integer,ind_tabl);
+ k=succ(integer,k);
+ } while (!(k==3));
+ y=y+1;
+ } while (!(y==9));
+ col=col+48*res;
+ } while (!(num_letr==6));
+ show_mouse();
+ }
+
+
+void draw_menu()
+ {
+ /* debug('draw_menu'); */
+ menu_aff();
+ active_menu=true;
+ msg4=no_choice;
+ msg3=no_choice;
+ choisi=false;
+ clic=false;
+ test0=false;
+ }
+
+void invers(integer ix)
+ {
+ varying_string<23> s;
+
+ /* debug('invers'); */
+ if (msg4==no_choice) return;
+ putxy(don[msg3][1] << 3,succ(void,lo(msg4)) << 3);
+ switch (msg3) {
+ case 1 : s= inv[lo(msg4)]; break;
+ case 2 : s= dep[lo(msg4)]; break;
+ case 3 : s= act[lo(msg4)]; break;
+ case 4 : s= self_[lo(msg4)]; break;
+ case 5 : s= dis[lo(msg4)]; break;
+ case 6 : s= fic[lo(msg4)]; break;
+ case 7 : s= fic[1]+' '+chr(48+lo(msg4)); break;
+ case 8 : if (lo(msg4)==1) s=recom;
+ else s= fic[2]+' '+chr(47+lo(msg4));
+ break;
+ }
+ if ((s[1]!='*') && (s[1]!='<')) writeg(s,ix);
+ else msg4=no_choice;
+ }
+
+void util(integer x,integer y)
+ {
+ integer ymx, dxcar, xmn, xmx, ix;
+
+ /* debug('util'); */
+ ymx= (don[msg3][4] << 3)+16;
+ dxcar= don[msg3][3];
+ xmn= (don[msg3][1] << 2)*res;
+ if (res==1) ix=5; else ix=3;
+ xmx= dxcar*ix*res+ xmn+ 2;
+ if ((x>xmn) && (x<xmx) && (y<ymx) && (y>15))
+ {
+ ix= pred(integer,(cardinal)y >> 3)+ (msg3 << 8);
+ if (ix!=msg4)
+ {
+ invers(1);
+ msg4=ix;
+ invers(0);
+ }
+ }
+ else if (msg4!=no_choice)
+ {
+ invers(1);
+ msg4=no_choice;
+ }
+ }
+
+void menu_down( integer ii)
+ {
+ integer cx, xcc;
+ integer xco, nb_lig;
+
+ /* debug('menu_down'); */
+ xco=don[ii][1];
+ nb_lig= don[ii][4];
+ hide_mouse();
+ sauvecr(10,succ(byte,don[ii][2]) << 1);
+ xco= xco << 3;
+ if (res==1) cx=10; else cx=6;
+ xcc= xco+ (don[ii][3]*cx)+6;
+ box(15, gd, xco,12, xcc, 10 + (don[ii][2] << 1), 255);
+ box(0, gd, xcc, 12, xcc+4, 10 + (don[ii][2] << 1),255);
+ box(0,gd,xco, 8 + (don[ii][2] << 1), xcc+4, 12 + (don[ii][2] << 1),255);
+ putxy(xco,16);
+ cx=0;
+ do {
+ cx= succ(integer,cx);
+ switch (ii) {
+ case 1 : if (inv[cx][1]!= '*') writeg(inv[cx],4); break;
+ case 2 : if (dep[cx][1]!= '*') writeg(dep[cx],4); break;
+ case 3 : if (act[cx][1]!= '*') writeg(act[cx],4); break;
+ case 4 : if (self_[cx][1]!='*') writeg(self_[cx],4); break;
+ case 5 : if (dis[cx][1]!= '*') writeg(dis[cx],4); break;
+ case 6 : writeg(fic[cx],4); break;
+ case 7 : writeg(fic[1]+' '+chr(48+cx),4); break;
+ case 8 : if (cx==1) writeg( recom,4);
+ else writeg(fic[2]+' '+chr(47+cx),4);
+ break;
+ }
+ putxy(xco,ywhere+8);
+ } while (!(cx==nb_lig));
+ test0=true;
+ show_mouse();
+ }
+
+void menu_up(integer xx)
+ {
+ /* debug('menu_up'); */
+ if (test0)
+ {
+ charecr(10,succ(byte,don[xx][2]) << 1);
+ test0=false;
+ }
+ }
+
+void erase_menu()
+ {
+ /* debug('erase_menu'); */
+ active_menu=false;
+ clic=false;
+ menu_up(msg3);
+ }
+
+void mdn()
+ {
+ integer x,y,c,a,ix;
+ boolean tes;
+
+ /* debug('mdn'); */
+ if (! active_menu) return;
+ x=x_s; y=y_s;
+ if (! clic)
+ {
+ if ((x==xprec) &&
+ (y==yprec)) return;
+ else {
+ xprec=x;
+ yprec=y;
+ }
+ tes=(y<11) && ((set::of(range(28*res,28*res+24),range(76*res,76*res+24), eos).has(x))
+ || ((x>124*res) && (x<124*res+24))
+ || ((x>172*res) && (x<172*res+24))
+ || ((x>220*res) && (x<220*res+24))
+ || ((x>268*res) && (x<268*res+24)));
+ if (tes)
+ {
+ if (x<76*res) ix=invent;
+ else if (x<124*res) ix=depla;
+ else if (x<172*res) ix=action;
+ else if (x<220*res) ix=saction;
+ else if (x<268*res) ix=discut;
+ else ix= fichier;
+ if ((ix!=msg3) || (! test0))
+ if (! ((ix==fichier) && (set::of(sauve, charge, eos).has(msg3))))
+ {
+ menu_up(msg3);
+ menu_down(ix);
+ msg3=ix;
+ msg4=no_choice;
+ }
+ }
+ else /* Not in the MenuTitle line */
+ {
+ if ((y>11) && (test0)) util(x,y);
+ }
+ }
+ else /* il y a eu 'clic' */
+ if ((msg3==fichier) && (msg4!=no_choice))
+ {
+ clic=false;
+ menu_up(msg3);
+ if (lo(msg4)==1) msg3=7;
+ else msg3=8;
+ menu_down(msg3);
+ }
+ else /* il y a eu clic sur un autre menu */
+ {
+ choisi=(test0) && (msg4!=no_choice);
+ menu_up(msg3);
+ msg[4]=msg4;
+ msg[3]=msg3;
+ msg3=no_choice;
+ msg4=no_choice;
+ clic=false;
+ }
+ }
+
diff --git a/engines/mortevielle/mor.h b/engines/mortevielle/mor.h
new file mode 100644
index 0000000000..a4fe1e1b6b
--- /dev/null
+++ b/engines/mortevielle/mor.h
@@ -0,0 +1,1457 @@
+/* Niveau 14 suite */
+const char m1[] = "quelqu'un entre, parait ‚tonn‚ mais ne dit rien";
+
+
+void testfi()
+ {
+ if (ioresult!= 0)
+ {
+ caff= do_alert(err_mess,1);
+ exit(0);
+ }
+ }
+
+
+integer readclock()
+{
+ registres r;
+ integer s, m, h;
+
+/* debug('readclock');*/
+ integer readclock_result;
+ r.ax = 0x2c00;
+ intr(0x21,r);
+ {
+ h=(cardinal)r.cx >> 8;
+ m=r.cx % 256;
+ s=(cardinal)r.dx >> 8;
+ }
+ m= m * 60;
+ h= h* 3600;
+ readclock_result= h+ m+ s;
+ return readclock_result;
+}
+
+void modif(integer& nu)
+{
+ /* debug('modif'); */
+ if (nu== 26) nu= 25;
+ if ((nu> 29) && (nu< 36)) nu= nu- 4;
+ if ((nu> 69) && (nu< 78)) nu= nu- 37;
+ if ((nu> 99) && (nu< 194)) nu= nu- 59;
+ if ((nu> 996) && (nu< 1000)) nu= nu- 862;
+ if ((nu> 1500) && (nu< 1507)) nu= nu- 1363;
+ if ((nu> 1507) && (nu< 1513)) nu= nu- 1364;
+ if ((nu> 1999) && (nu< 2002)) nu= nu- 1851;
+ if (nu== 2010) nu= 151;
+ if ((nu> 2011) && (nu< 2025)) nu= nu- 1860;
+ if (nu== 2026) nu= 165;
+ if ((nu> 2029) && (nu< 2037)) nu= nu- 1864;
+ if ((nu> 3000) && (nu< 3005)) nu= nu- 2828;
+ if (nu== 4100) nu= 177;
+ if (nu== 4150) nu= 178;
+ if ((nu> 4151) && (nu< 4156)) nu= nu- 3973;
+ if (nu== 4157) nu= 183;
+ if ((nu== 4160) || (nu== 4161)) nu= nu- 3976;
+}
+
+
+void dessine(integer ad, integer x, integer y)
+{
+ /* debug('dessine'); */
+ hide_mouse();
+ writepal(numpal);
+ pictout(ad,0,x,y);
+ show_mouse();
+}
+
+void dessine_rouleau()
+{
+ /* debug('dessine_rouleau'); */
+ writepal(89);
+ if (gd==her)
+ {
+ mem[0x7000+14]=15;
+ }
+ hide_mouse();
+ pictout(0x73a2,0,0,0);
+ show_mouse();
+}
+
+
+void text_color(integer c)
+{
+ color_txt= c;
+}
+
+/* NIVEAU 13 */
+
+
+void text1(integer x,integer y,integer nb,integer m)
+{
+ phrase st;
+ integer tay;
+ integer co;
+
+
+ /* debug('text'); */
+ if (res==1) co=10; else co=6;
+ deline(m,st,tay);
+ if ((y==182) && (tay*co>nb*6)) y=176;
+ afftex(st,x,y,nb,20,color_txt);
+}
+
+void initouv()
+ {
+ integer cx;
+
+ /* debug('initouv'); */
+ for( cx= 1; cx <= 7; cx ++) touv[cx]= chr(0);
+ }
+
+void ecrf1()
+{
+ boite(0, 11, 512, 163, 15); /* grand dessin */
+}
+
+void clsf1()
+{
+ integer i,j;
+
+ /* debug('clsf1'); */
+ hide_mouse();
+ box(0,gd, 0,11, 514,175, 255);
+/* if Gd=ams then port[$3DD]:=15;
+ case Gd of
+ ams,
+ cga : begin
+ for j:=0 to 63 do
+ begin
+ for i:=6 to 86 do
+ begin
+ mem[$B800:i*80+j]:=0;
+ mem[$Ba00:i*80+j]:=0;
+ end;
+ mem[$b800:6960+j]:=0;
+ mem[$ba00:400+j]:=0;
+ end;
+ end;
+ ega : begin
+ port[$3C4]:= 2;
+ port[$3C5]:= 15;
+ port[$3CE]:= 8;
+ port[$3CF]:= 255;
+ for j:=0 to 63 do
+ for i:=11 to 174 do
+ mem[$A000:i*80+j]:=0;
+ end;
+ tan : begin
+ for j:=0 to 128 do
+ begin
+ for i:=3 to 43 do
+ begin
+ mem[$B800:i*160+j]:=0;
+ mem[$Ba00:i*160+j]:=0;
+ mem[$bc00:i*160+j]:=0;
+ if i<>43 then mem[$be00:i*160+j]:=0;
+ end;
+ mem[$be00:320+j]:=0;
+ end;
+ end;
+ end;
+ droite(256*res,11,256*res,175,0);*/
+ show_mouse();
+}
+
+void clsf2()
+{
+ integer i,j;
+
+ /* debug('clsf2'); */
+ hide_mouse();
+ if (f2_all)
+ {
+ box(0,gd,1,176,633,199,255);
+ boite(0,175,634,24,15);
+ f2_all=false;
+ }
+ else
+ {
+ box(0,gd,1,176,633,190,255);
+ boite(0,175,634,15,15);
+ }
+ show_mouse();
+}
+
+void ecrf2()
+{
+ /* debug('ecrf2'); */
+ text_color(5);
+ /*boite(0,175,630,15,15);*/
+}
+
+void ecr2(str255 str_)
+{
+ integer tab;
+ integer tlig;
+
+ /* debug('ecr2 : '+str_);*/
+ if (res==1) tab=10; else tab=6;
+ putxy(8,177);
+ tlig=59+pred(integer,res)*36;
+ if (length(str_)<tlig) writeg(str_,5);
+ else if (length(str_)<(tlig << 1))
+ {
+ putxy(8,176);
+ writeg(copy(str_,1,pred(integer,tlig)),5);
+ putxy(8,182);
+ writeg(copy(str_,tlig,tlig << 1),5);
+ }
+ else {
+ f2_all=true;
+ clsf2();
+ putxy(8,176);
+ writeg(copy(str_,1,pred(integer,tlig)),5);
+ putxy(8,182);
+ writeg(copy(str_,tlig,pred(integer,tlig << 1)),5);
+ putxy(8,190);
+ writeg(copy(str_,tlig << 1,tlig*3),5);
+ }
+}
+
+void clsf3()
+{
+ integer i,j;
+
+ /* debug('clsf3'); */
+ hide_mouse();
+ box(0,gd,1,192,633,199,255);
+ boite(0,191,634,8,15);
+ show_mouse();
+}
+
+void ecr3(str255 text)
+{
+ /* debug('ecr3 : '+text);*/
+ clsf3();
+ putxy(8,192);
+ writeg(text,5);
+}
+
+void ecrf6()
+{
+ /* debug('ecrf6'); */
+ text_color(5);
+ boite(62, 33, 363, 80, 15);
+}
+
+void ecrf7()
+{
+ text_color(4);
+/* draw_mode(2);
+ text_height(4*res);
+ text_style(normal);*/
+}
+
+void clsf10()
+{
+ integer co,cod;
+ varying_string<8> st;
+
+ /* debug('clsf10'); */
+ hide_mouse();
+ if (res==1)
+ {
+ co=634;
+ cod=534;
+ }
+ else
+ {
+ co=600;
+ cod=544;
+ }
+ box(15,gd, cod, 93, co, 98, 255);
+ if (s.conf< 33) st="Cool";
+ else
+ if (s.conf< 66) st=" Lourde ";
+ else
+ if (s.conf> 65) st="Malsaine";
+ if (res==1) co=10; else co=6;
+ co= 574-((cardinal)co*length(st) >> 1);
+ putxy(co,92);
+ writeg(st,4);
+ if (res==1) co=620; else co=584;
+ box(15,gd, 560, 24, co, 86, 255);
+/* rempli(69,12,32,5,255);*/
+ show_mouse();
+}
+
+ void stop()
+ {
+ clrscr;
+ hirs();
+ gd=ams;
+ hirs();
+ exit(0);
+ }
+
+void paint_rect(integer x, integer y, integer dx, integer dy)
+ {
+ integer co;
+
+ /* debug('paint_rect'); */
+ if (gd==cga) co= 3;
+ else co=11;
+ box(co,gd,x,y,x+dx,y+dy,255);
+ }
+
+integer hazard(integer min,integer max)
+ {
+ integer ha1;
+ real ha2;
+
+ /* debug('hazard'); */
+ integer hazard_result;
+ ha2= Random();
+ ha1= trunc(ha2*(max-min));
+ hazard_result= min+ ha1;
+ return hazard_result;
+ }
+
+void calch(integer& j,integer& h,integer& m)
+{
+ integer th,nh;
+
+/* debug('calch');*/
+ nh= readclock();
+ th= jh+ ((nh- mh) / t);
+ m= ((th % 2)+ vm)* 30;
+ h= ((cardinal)th >> 1)+ vh;
+ if (m== 60)
+ {
+ m= 0;
+ h= h+ 1;
+ }
+ j= (h / 24)+ vj;
+ h= h- ((j- vj)* 24);
+}
+
+void conv(integer x, integer& y)
+{
+ integer cx;
+
+ /* debug('conv'); */
+ cx= 1;
+ y= 128;
+ while (cx< x)
+ {
+ y= (cardinal)y >> 1;
+ cx= succ(integer,cx);
+ }
+}
+
+/* NIVEAU 12 */
+void okpas()
+{
+ tesok=true;
+}
+
+void modobj(integer m)
+{
+ phrase str_;
+ str30 strp;
+ integer i,tay;
+
+ /* debug('modobj'); */
+ strp=' ';
+ if (m!= 500)
+ {
+ deline(m- 501+ c_st41,str_,tay);
+ strp= delig;
+ }
+ menut( invt[8], strp);
+ menu_disable( invt[8]);
+}
+
+void modobj2(integer m,boolean t1,boolean t2)
+{
+ phrase str_;
+ str30 strp;
+ integer i,tay;
+
+ /* debug('modobj'); */
+ strp=' ';
+ if (t1 || t2) okpas();
+ else tesok=false;;
+ if (m!= 500)
+ {
+ deline(m- 501+ c_st41,str_,tay);
+ strp= delig;
+ }
+ menut( invt[8], strp);
+ menu_disable( invt[8]);
+}
+
+
+void repon(integer f,integer m)
+{
+ str255 str_;
+ varying_string<40> str1;
+ phrase st;
+ text1 fic;
+ integer i, xco, dx, caspe, tay;
+
+ /* debug('repon fenetre nø'+chr(f+48));*/
+ if ((m> 499) && (m< 563))
+ {
+ deline( m-501+c_st41,st,tay);
+ if (tay>((58+pred(integer,res)*37) << 1)) f2_all= true;
+ else f2_all= false;
+ clsf2();
+ afftex(st,8,176,85,3,5);
+ }
+ else
+ {
+ modif(m);
+ if (f== 8) f= 2;
+ if (f== 1) f= 6;
+ if (f== 2)
+ {
+ clsf2();
+ ecrf2();
+ text1(8, 182, 103, m);
+ if ((m== 68) || (m== 69)) s.teauto[40]= '*';
+ if ((m== 104) && (caff== 14))
+ {
+ s.teauto[36]= '*';
+ if (s.teauto[39]== '*')
+ {
+ s.pourc[3]= '*';
+ s.teauto[38]= '*';
+ }
+ }
+ }
+ if (set::of(6,9, eos).has(f))
+ {
+ deline(m,st,tay);
+ if (f==6) i=4;
+ else i=5;
+ afftex(st,80,40,60,25,i);
+ if (m== 180) s.pourc[6]= '*';
+ if (m== 179) s.pourc[10]= '*';
+ }
+ if (f== 7) /* messint */
+ {
+ ecrf7();
+ deline(m,st,tay);
+ if (res==1)
+ {
+ xco=252-tay*5;
+ caspe= 100;
+ dx= 80;
+ }
+ else
+ {
+ xco=252-tay*3;
+ caspe= 144;
+ dx=50;
+ }
+ if (tay<40) afftex(st,xco,86,dx,3,5);
+ else afftex(st,caspe,86,dx,3,5);
+ }
+ }
+}
+
+void f3f8()
+{
+ integer co;
+
+ if (res==1) co=107; else co=64;
+ putxy(3,44);
+ writeg(f3,5);
+ ywhere= 51;
+ writeg(f8,5);
+ boite(0,42,co,16,7);
+}
+
+void t5(integer cx)
+{
+ /* debug('t5'); */
+ if (cx== 10) blo= false;
+ if (cx!= 1)
+ {
+ bh1= false;
+ bf1= false;
+ }
+ if (cx!= 2) bh2= false;
+ if (cx!= 4)
+ {
+ bh4= false;
+ bf4= false;
+ }
+ if (cx!= 5) bh5= false;
+ if (cx!= 6) bh6= false;
+ if (cx!= 8) bh8= false;
+ if (cx!= 3) bt3= false;
+ if (cx!= 7) bt7= false;
+ if (cx!= 9) bh9= false;
+}
+
+void affper(integer per)
+{
+ integer cx;
+
+ /* debug('affper'); */
+ for( cx= 1; cx <= 8; cx ++) menu_disable( disc[cx]);
+ clsf10();
+ if ((per & 128)== 128)
+ {
+ putxy(560,24);
+ writeg("LEO",4);
+ menu_enable( disc[1]);
+ }
+ if ((per & 64)== 64)
+ {
+ putxy(560, 32);
+ writeg("PAT",4);
+ menu_enable( disc[2]);
+ }
+ if ((per & 32)== 32)
+ {
+ putxy(560, 40);
+ writeg("GUY",4);
+ menu_enable( disc[3]);
+ }
+ if ((per & 16)== 16)
+ {
+ putxy(560,48);
+ writeg("EVA",4);
+ menu_enable( disc[4]);
+ }
+ if ((per & 8)== 8)
+ {
+ putxy(560,56);
+ writeg("BOB",4);
+ menu_enable( disc[5]);
+ }
+ if ((per & 4)== 4)
+ {
+ putxy(560, 64);
+ writeg("LUC",4);
+ menu_enable( disc[6]);
+ }
+ if ((per & 2)== 2)
+ {
+ putxy(560, 72);
+ writeg("IDA",4);
+ menu_enable( disc[7]);
+ }
+ if ((per & 1)== 1)
+ {
+ putxy(560, 80);
+ writeg("MAX",4);
+ menu_enable( disc[8]);
+ }
+ ipers= per;
+}
+
+/* overlay */ void choix(integer min,integer max, integer& per)
+{
+ boolean i;
+ integer haz,cx,cy,cz;
+ long_integer per2,cz2;
+
+ /* debug('o0 choix'); */
+ haz= hazard(min,max);
+ if (haz> 4)
+ {
+ haz= 8- haz;
+ i= true;
+ }
+ else i= false;
+ cx= 0;
+ per= 0;
+ while (cx< haz)
+ {
+ cy= hazard(1,8);
+ conv(cy,cz);
+ if ((per & cz)!= cz)
+ {
+ cx= cx+ 1;
+ per= (per | cz);
+ }
+ }
+ if (i) per= 255- per;
+ i= false;
+}
+
+/* overlay */ void cpl1(integer& p)
+{
+ integer j,h,m;
+
+ /* debug('o0 cpl1'); */
+ calch(j,h,m);
+ if ((h> 7) || (h< 11)) p= 25;
+ if ((h> 10) && (h< 14)) p= 35;
+ if ((h> 13) && (h< 16)) p= 50;
+ if ((h> 15) && (h< 18)) p= 5;
+ if ((h> 17) && (h< 22)) p= 35;
+ if ((h> 21) && (h< 24)) p= 50;
+ if ((h>= 0) && (h< 8)) p= 70;
+ mdn();
+}
+
+/* overlay */ void cpl2(integer& p)
+{
+ integer j,h,m;
+
+ /* debug('o0 cpl2'); */
+ calch(j,h,m);
+ if ((h> 7) && (h< 11)) p= -2;
+ if (h== 11) p= 100;
+ if ((h> 11) && (h< 23)) p= 10;
+ if (h== 23) p= 20;
+ if ((h>= 0) && (h< 8)) p= 50;
+}
+
+/* overlay */ void cpl3(integer& p)
+{
+ integer j,h,m;
+
+ /* debug('o0 cpl3'); */
+ calch(j,h,m);
+ if (((h> 8) && (h< 10)) || ((h> 19) && (h< 24))) p= 34;
+ if (((h> 9) && (h< 20)) || ((h>= 0) && (h< 9))) p= 0;
+}
+
+/* overlay */ void cpl5(integer& p)
+{
+ integer j,h,m;
+
+ /* debug('o0 cpl5'); */
+ calch(j,h,m);
+ if ((h> 6) && (h< 10)) p= 0;
+ if (h== 10) p= 100;
+ if ((h> 10) && (h< 24)) p= 15;
+ if ((h>= 0) && (h< 7)) p= 50;
+}
+
+/* overlay */ void cpl6(integer& p)
+{
+ integer j,h,m;
+
+ /* debug('o0 cpl6'); */
+ calch(j,h,m);
+ if (((h> 7) && (h< 13)) || ((h> 17) && (h< 20))) p= -2;
+ if (((h> 12) && (h< 17)) || ((h> 19) && (h< 24))) p= 35;
+ if (h== 17) p= 100;
+ if ((h>= 0) && (h< 8)) p= 60;
+}
+
+void person()
+{
+ const char m1[] = "Vous";
+ const char m2[] = "ˆtes";
+ const char m3[] = "SEUL";
+ integer cf;
+ str255 str_;
+
+ /* debug('person'); */
+ for( cf= 1; cf <= 8; cf ++) menu_disable( disc[cf]);
+ clsf10();
+ putxy(560, 30);
+ writeg(m1,4);
+ putxy(560, 50);
+ writeg(m2,4);
+ putxy(560, 70);
+ writeg(m3,4);
+ ipers= 0;
+}
+
+void chlm(integer& per)
+{
+ /* debug('chlm'); */
+ per= hazard(1,2);
+ if (per== 2) per= 128;
+}
+
+void pendule()
+{
+ const matrix<1,2,1,12,integer> cv
+ = {{{{ 5, 8, 10, 8, 5, 0, -5, -8, -10, -8, -5, 0}},
+ {{-5, -3, 0, 3, 5, 6, 5, 3, 0, -3, -5, -6}} }};
+ const integer x = 580;
+ const integer y = 123;
+ const integer rg = 9;
+ integer h,co;
+
+
+ /* debug('pendule'); */
+ hide_mouse();
+ /*paint_rect(572,114,18,20);
+ paint_rect(577,114,6,20);*/
+ paint_rect(570,118,20,10);
+ paint_rect(578,114,6,18);
+ if (set::of(cga,her, eos).has(gd)) co=0; else co=1;
+ if (min== 0) droite(((cardinal)x >> 1)*res, y, ((cardinal)x >> 1)*res, (y- rg), co);
+ else droite(((cardinal)x >> 1)*res, y, ((cardinal)x >> 1)*res, (y+ rg), co);
+ h= heu;
+ if (h> 12) h= h- 12;
+ if (h== 0) h= 12;
+ droite(((cardinal)x >> 1)*res, y, ((cardinal)(x+ cv[1][h]) >> 1)*res, y+ cv[2][h], co);
+ show_mouse();
+ putxy( 568, 154);
+ if (heu> 11) writeg( "PM ",1);
+ else writeg( "AM ",1);
+ putxy( 550, 160);
+ if (set::of(range(0,8), eos).has(jou)) writeg(string(chr(jou+49))+"& jour",1);
+}
+
+/*************
+ * NIVEAU 11 *
+ *************/
+
+void debloc(integer l)
+{
+/* debug('debloc'); */
+ num= 0;
+ x= 0;
+ y= 0;
+ if ((l!= 26) && (l!= 15)) t5(l);
+ mpers= ipers;
+}
+
+/* overlay */ void cpl10(integer& p,integer& h)
+{
+ integer j,m;
+
+/* debug('o1 cpl10'); */
+ calch(j,h,m);
+ if (((h> 7) && (h< 11)) || ((h> 11) && (h< 14))
+ || ((h> 18) && (h< 21))) p= 100;
+ if ((h== 11) || ((h> 20) && (h< 24))) p= 45;
+ if (((h> 13) && (h< 17)) || (h== 18)) p= 35;
+ if (h== 17) p= 60;
+ if ((h>= 0) && (h< 8)) p= 5;
+}
+
+/* overlay */ void cpl11(integer& p,integer& h)
+{
+ integer j,m;
+
+/* debug('o1 cpl11'); */
+ calch(j,h,m);
+ if (((h> 8) && (h< 12)) || ((h> 20) && (h< 24))) p= 25;
+ if (((h> 11) && (h< 14)) || ((h> 18) && (h< 21))) p= 5;
+ if ((h> 13) && (h< 17)) p= 55;
+ if ((h> 16) && (h< 19)) p= 45;
+ if ((h>= 0) && (h< 9)) p= 0;
+}
+
+/* overlay */ void cpl12(integer& p)
+{
+ integer j,h,m;
+
+/* debug('o1 cpl12'); */
+ calch(j,h,m);
+ if (((h> 8) && (h< 15)) || ((h> 16) && (h< 22))) p= 55;
+ if (((h> 14) && (h< 17)) || ((h> 21) && (h< 24))) p= 25;
+ if ((h>= 0) && (h< 5)) p= 0;
+ if ((h> 4) && (h< 9)) p= 15;
+}
+
+/* overlay */ void cpl13(integer& p)
+{
+/* debug('o1 cpl13'); */
+ p= 0;
+}
+
+/* overlay */ void cpl15(integer& p)
+{
+ integer j,h,m;
+
+/* debug('o1 cpl15'); */
+ calch(j,h,m);
+ if ((h> 7) && (h< 12)) p= 25;
+ if ((h> 11) && (h< 14)) p= 0;
+ if ((h> 13) && (h< 18)) p= 10;
+ if ((h> 17) && (h< 20)) p= 55;
+ if ((h> 19) && (h< 22)) p= 5;
+ if ((h> 21) && (h< 24)) p= 15;
+ if ((h>= 0) && (h< 8)) p= -15;
+}
+
+/* overlay */ void cpl20(integer& p,integer& h)
+{
+ integer j,m;
+
+/* debug('o1 cpl20'); */
+ calch(j,h,m);
+ if (h== 10) p= 65;
+ if ((h> 10) && (h< 21)) p= 5;
+ if ((h> 20) && (h< 24)) p= -15;
+ if ((h>= 0) && (h< 5)) p= -300;
+ if ((h> 4) && (h< 10)) p= -5;
+}
+
+/* overlay */ void quelq1(integer l)
+{
+ integer per;
+
+/* debug('o1 quelq1'); */
+ per= hazard(1,2);
+ if (l== 1)
+ if (per== 1) bh1= true; else bf1= true;
+ if (l== 4)
+ if (per== 1) bh4= true; else bf4= true;
+ ipers= 10;
+}
+
+/* overlay */ void quelq2()
+{
+/* debug('o1 quelq2'); */
+ if (li== 2) bh2= true; else bh9= true;
+ ipers= 10;
+}
+
+/* overlay */ void quelq5()
+{
+/* debug('o1 quelq5'); */
+ bh5= true;
+ ipers= 10;
+}
+
+/* overlay */ void quelq6(integer l)
+{
+ integer per;
+
+/* debug('o1 quelq6'); */
+ if (l== 6) bh6= true;
+ if (l== 8) bh8= true;
+ ipers= 10;
+}
+
+/* overlay */ void quelq10(integer h, integer& per)
+{
+ integer min,max;
+
+/* debug('o1 quelq10'); */
+ if ((h>= 0) && (h< 8)) chlm(per); else
+ {
+ if ((h> 7) && (h< 10))
+ {
+ min= 5;
+ max= 7;
+ }
+ if ((h> 9) && (h< 12))
+ {
+ min= 1;
+ max= 4;
+ }
+ if (((h> 11) && (h< 15)) || ((h> 18) && (h< 21)))
+ {
+ min= 6;
+ max= 8;
+ }
+ if (((h> 14) && (h< 19)) || ((h> 20) && (h< 24)))
+ {
+ min= 1;
+ max= 5;
+ }
+ choix(min,max,per);
+ }
+ affper(per);
+}
+
+/* overlay */ void quelq11(integer h, integer& per)
+{
+ integer min,max;
+
+/* debug('o1 quelq11'); */
+ if ((h>= 0) && (h< 8)) chlm(per); else
+ {
+ if (((h> 7) && (h< 10)) || ((h>20) && (h< 24)))
+ {
+ min= 1;
+ max= 3;
+ }
+ if (((h> 9) && (h< 12)) || ((h> 13) && (h< 19)))
+ {
+ min= 1;
+ max= 4;
+ }
+ if (((h> 11) && (h< 14)) || ((h> 18) && (h< 21)))
+ {
+ min= 1;
+ max= 2;
+ }
+ choix(min,max,per);
+ }
+ affper(per);
+}
+
+/* overlay */ void quelq12(integer& per)
+{
+/* debug('o1 quelq12'); */
+ chlm(per);
+ affper(per);
+}
+
+/* overlay */ void quelq15(integer& per)
+{
+ integer cx;
+ boolean test;
+
+
+/* debug('o1 quelq15'); */
+ per= 0;
+ if (per== 0)
+ {
+ do {
+ cx= hazard(1,8);
+ test =(((cx== 1) && (bh2 || bh9)) ||
+ ((cx== 2) && bh8) ||
+ ((cx== 3) && bh4) ||
+ ((cx== 4) && bf4) ||
+ ((cx== 5) && bh6) ||
+ ((cx== 6) && bh1) ||
+ ((cx== 7) && bf1) ||
+ ((cx== 8) && bh5));
+ } while (!(! test));
+ conv(cx,per);
+ affper(per);
+ }
+}
+
+/* overlay */ void quelq20(integer h, integer& per)
+{
+ integer min,max;
+
+/* debug('o1 quelq20'); */
+ if (((h>= 0) && (h< 10)) || ((h> 18) && (h< 24))) chlm(per);
+ else
+ {
+ if ((h> 9) && (h< 12))
+ {
+ min= 3;
+ max= 7;
+ }
+ if ((h> 11) && (h< 18))
+ {
+ min= 1;
+ max= 2;
+ }
+ if (h== 18)
+ {
+ min= 2;
+ max= 4;
+ }
+ choix(min,max,per);
+ }
+ affper(per);
+}
+
+
+/* overlay */void frap()
+{
+ integer j,h,m,haz;
+
+/* debug('o1 frap'); */
+ calch(j,h,m);
+ if ((h>= 0) && (h< 8)) crep= 190; else
+ {
+ haz= hazard(1,100);
+ if (haz> 70) crep= 190; else crep= 147;
+ }
+}
+
+/* overlay */ void nouvp(integer l, integer& p)
+{
+/* debug('o1 nouvp'); */
+ p= 0;
+ if (l== 1)
+ {
+ if (bh1) p= 4;
+ if (bf1) p= 2;
+ }
+ if (((l== 2) && (bh2)) || ((l== 9) && (bh9))) p= 128;
+ if (l== 4)
+ {
+ if (bh4) p= 32;
+ if (bf4) p= 16;
+ }
+ if ((l== 5) && (bh5)) p= 1;
+ if ((l== 6) && (bh6)) p= 8;
+ if ((l== 8) && (bh8)) p= 64;
+ if (((l== 3) && (bt3)) || ((l== 7) && (bt7))) p= 9;
+ if (p!= 9) affper(p);
+}
+
+
+
+/* overlay */ void tip(integer ip, integer& cx)
+{
+/* debug('o1 tip'); */
+ if (ip== 128) cx= 1; else
+ if (ip== 64) cx= 2; else
+ if (ip== 32) cx= 3; else
+ if (ip== 16) cx= 4; else
+ if (ip== 8) cx= 5; else
+ if (ip== 4) cx= 6; else
+ if (ip== 2) cx= 7; else
+ if (ip== 1) cx= 8;
+}
+
+
+/* overlay */ void ecfren(integer& p,integer& haz, integer cf,integer l)
+{
+/* debug('o1 ecfren'); */
+ if (l== 0) person();
+ p= -500;
+ haz= 0;
+ if (((l== 1) && (! bh1) && (! bf1))
+ || ((l== 4) && (! bh4) && (! bf4))) cpl1(p);
+ if ((l== 2) && (! bh2) && (! bh9)) cpl2(p);
+ if (((l== 3) && (! bt3)) || ((l== 7) && (! bt7))) cpl3(p);
+ if ((l== 5) && (! bh5)) cpl5(p);
+ if (((l== 6) && (! bh6)) || ((l== 8) && (! bh8))) cpl6(p);
+ if ((l== 9) && (! bh9) && (! bh2)) p= 10;
+ if (((l== 2) && (bh9)) || ((l== 9) && (bh2))) p= -400;
+ if (p!= -500)
+ {
+ p= p+ cf;
+ haz= hazard(1,100);
+ }
+}
+
+/* overlay */ void becfren(integer l)
+{
+ integer haz;
+
+/* debug('o1 becfren'); */
+ if ((l== 1) || (l== 4))
+ {
+ haz= hazard(1,2);
+ if (l== 1)
+ if (haz== 1) bh1= true; else bf1= true;
+ if (l== 4)
+ if (haz== 1) bh4= true; else bf4= true;
+ }
+ if (l== 2) bh2= true; else
+ if (l== 3) bt3= true; else
+ if (l== 5) bh5= true; else
+ if (l== 6) bh6= true; else
+ if (l== 7) bt7= true; else
+ if (l== 8) bh8= true; else
+ if (l== 9) bh9= true;
+}
+
+/* NIVEAU 10 */
+void init_nbrepm()
+{
+ const array<1,8,byte> ipm
+ = {{4,5,6,7,5,6,5,8}};
+ integer i;
+
+/* debug('init_nbrepm'); */
+ i= 0;
+ do {
+ i= succ(integer,i);
+ nbrepm[i]= ipm[i];
+ } while (!(i==8));
+}
+
+void phaz(integer& haz,integer& p, integer cf)
+{
+/* debug('phaz'); */
+ p= p+ cf;
+ haz= hazard(1,100);
+}
+
+/* overlay */ void inzon()
+{
+ integer cx;
+
+/* debug('o2 inzon'); */
+ copcha();
+ {
+ s.ipre = false;
+ s.derobj= 0;
+ s.icave = 0;
+ s.iboul = 0;
+ s.ibag = 0;
+ s.ipuit = 0;
+ s.ivier = 0;
+ s.iloic = 136;
+ s.icryp = 141;
+ s.conf = hazard(4,10);
+ s.mlieu = 21;
+ for( cx= 2; cx <= 6; cx ++) s.sjer[cx]= chr(0);
+ s.sjer[1]= chr(113);
+ s.heure= chr(20);
+ for( cx= 1; cx <= 10; cx ++) s.pourc[cx]= ' ';
+ for( cx= 1; cx <= 6; cx ++) s.teauto[cx]= '*';
+ for( cx= 7; cx <= 9; cx ++) s.teauto[cx]= ' ';
+ for( cx= 10; cx <= 28; cx ++) s.teauto[cx]= '*';
+ for( cx= 29; cx <= 42; cx ++) s.teauto[cx]= ' ';
+ s.teauto[33]= '*';
+ }
+ for( cx= 1; cx <= 8; cx ++) nbrep[cx]= 0;
+ init_nbrepm();
+}
+
+/* overlay */ void dprog()
+{
+/* debug('o2 dprog'); */
+ li= 21;
+ /* jh:= t_settime(0);*/
+ jh= 0;
+ if (! s.ipre) blo= true;
+ t= ti1;
+ mh= readclock();
+}
+
+/* overlay */ void pl1(integer cf)
+{
+ integer p, haz;
+
+/* debug('o2 pl1'); */
+ if (((li== 1) && (! bh1) && (! bf1))
+ || ((li== 4) && (! bh4) && (! bf4)))
+ {
+ cpl1(p);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq1(li);
+ }
+}
+
+/* overlay */ void pl2(integer cf)
+{
+ integer p,haz;
+
+/* debug('o2 pl2'); */
+ if (! bh2)
+ {
+ cpl2(p);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq2();
+ }
+}
+
+/* overlay */ void pl5(integer cf)
+{
+ integer p,haz;
+
+/* debug('o2 pl5'); */
+ if (! bh5)
+ {
+ cpl5(p);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq5();
+ }
+}
+
+/* overlay */ void pl6(integer cf)
+{
+ integer p,haz;
+
+/* debug('o2 pl6'); */
+ if (((li== 6) && (! bh6)) || ((li== 8) && (! bh8)))
+ {
+ cpl6(p);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq6(li);
+ }
+}
+
+/* overlayi */ void pl9(integer cf)
+{
+ integer p,haz;
+
+/* debug('o2 pl9'); */
+ if (! bh9)
+ {
+ cf= -10;
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq2();
+ }
+}
+
+/* overlayi */ void pl10(integer cf)
+{
+ integer p,h,haz;
+
+/* debug('o2 pl10'); */
+ cpl10(p,h);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq10(h,p);
+}
+
+/* overlay */ void pl11(integer cf)
+{
+ integer p,h,haz;
+
+/* debug('o2 pl11'); */
+ cpl11(p,h);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq11(h,p);
+}
+
+/* overlay */ void pl12(integer cf)
+{
+ integer p,haz;
+
+/* debug('o2 pl12'); */
+ cpl12(p);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq12(p);
+}
+
+/* overlay */ void pl13(integer cf)
+{
+ integer p,haz;
+
+/* debug('o2 pl13'); */
+ cpl13(p);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq12(p);
+}
+
+/* overlay */ void pl15(integer cf)
+{
+ integer p,haz;
+
+/* debug('o2 pl15'); */
+ cpl15(p);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq15(p);
+}
+
+/* overlay */ void pl20(integer cf)
+{
+ integer p,h,haz;
+
+/* debug('o2 pl20'); */
+ cpl20(p,h);
+ phaz(haz,p,cf);
+ if (haz> p) person(); else quelq20(h,p);
+}
+
+/* overlay */ void t11(integer l11, integer& a)
+{
+ integer p,haz,h;
+
+/* debug('o2 t11'); */
+ ecfren(p,haz,s.conf,l11);
+ li= l11;
+ if ((l11> 0) && (l11< 10))
+ if (p!= -500)
+ {
+ if (haz> p)
+ {
+ person();
+ a= 0;
+ }
+ else
+ {
+ becfren(li);
+ nouvp(li,a);
+ }
+ }
+ else nouvp(li,a);
+ if (l11> 9)
+ if ((l11> 15) && (l11!= 20) && (l11!= 26)) person(); else
+ {
+ if (l11== 10) cpl10(p,h);
+ if (l11== 11) cpl11(p,h);
+ if (l11== 12) cpl12(p);
+ if ((l11== 13) || (l11== 14)) cpl13(p);
+ if ((l11== 15) || (l11== 26)) cpl15(p);
+ if (l11== 20) cpl20(p,h);
+ p= p+ s.conf;
+ haz= hazard(1,100);
+ if (haz> p)
+ {
+ person();
+ a= 0;
+ }
+ else
+ {
+ if (l11== 10) quelq10(h,p);
+ if (l11== 11) quelq11(h,p);
+ if ((l11== 12) || (l11== 13) || (l11== 14)) quelq12(p);
+ if ((l11== 15) || (l11== 26)) quelq15(p);
+ if (l11== 20) quelq20(h,p);
+ a= p;
+ }
+ }
+}
+
+/* overlay */ void cavegre()
+
+{
+ integer haz;
+
+/* debug('cavegre'); */
+ s.conf= s.conf+ 2;
+ if (s.conf> 69) s.conf= s.conf+ (s.conf / 10);
+ clsf3();
+ ecrf2();
+ ecr3(m1);
+ haz= (hazard(0, 4))- 2;
+ parole(2, haz, 1);
+ for( haz=0; haz <= 3000; haz ++);
+ clsf3();
+ person();
+}
+
+void writetp(str255 s,integer t)
+{
+ if (res==2) writeg(s,t);
+ else writeg(copy(s,1,25),t);
+}
+
+void messint(integer nu)
+{
+/* debug('messint'); */
+ clsf1();
+ clsf2();
+ clsf3();
+ decomp( 0x73a2, 1008);
+ memw[0x7413+12]= 80;
+ memw[0x7413+14]= 40;
+ writepal(90);
+ afff(gd,0x73a2, 1008,0,0);
+ afff(gd,0x73a2, 1008,0,70);
+ repon(7,nu);
+}
+
+void aniof(integer ouf,integer num)
+ {
+ integer ad, offset;
+ char c;
+
+ /* debug('aniof'); */
+ if ((caff== 7) && ((num== 4) || (num== 5))) return;
+ if ((caff== 10) && (num== 7)) num= 6;
+ if (caff== 12) if (num== 3) num= 4;
+ else if (num== 4) num= 3;
+ ad= adani;
+ offset= animof(ouf,num);
+ decomp(ad,offset);
+ hide_mouse();
+ afff(gd,ad,offset,0,12);
+ ecrf1();
+ show_mouse();
+ }
+
+void musique(integer so)
+{
+ boolean i;
+ integer haz;
+/* dep: array[1..5] of long_integer;*/
+
+/* debug('musique'); */
+ if (so== 0) /*musik(0)*/ {; }
+ else
+ if ((prebru== 0) && (! s.ipre))
+ {
+ parole(10, 1, 1);
+ prebru= prebru+ 1;
+ }
+ else
+ {
+ i= false;
+ if ((s.mlieu== 19) || (s.mlieu== 21) || (s.mlieu== 22))
+ {
+ haz= hazard(1,3);
+ if (haz== 2)
+ {
+ haz= hazard(2,4);
+ parole(9,haz,1);
+ i= true;
+ }
+ }
+ if (s.mlieu== 20)
+ {
+ haz= hazard(1,2);
+ if (haz== 1)
+ {
+ parole(8,1,1);
+ i= true;
+ }
+ }
+ if (s.mlieu== 24)
+ {
+ haz= hazard(1,2);
+ if (haz== 2)
+ {
+ parole(12,1,1);
+ i= true;
+ }
+ }
+ if (s.mlieu== 23)
+ {
+ parole(13,1,1);
+ i= true;
+ }
+ if (! i)
+ {
+ /* dep[1]:= 1416;
+ dep[2]:= 1512;
+ dep[3]:= 1692;
+ dep[4]:= 1884;
+ dep[5]:= 2046;
+ haz:= hazard(1,5);
+ musik(dep[haz]);*/
+ haz= hazard(1,17);
+ parole(haz,1,2);
+ }
+ }
+}
+
+/* NIVEAU 9 */
+void dessin(integer ad)
+{
+ integer cx;
+
+/* debug('dessin'); */
+ if (ad!= 0) dessine(ades,((ad % 160)* 2),(ad / 160));
+ else
+ {
+ clsf1();
+ if (caff> 99)
+ {
+ dessine(ades,60,33);
+ boite(118, 32, 291, 121, 15); /* cadre moyen */
+ }
+ else
+ if (caff> 69)
+ {
+ dessine(ades,112,48); /* tˆtes */
+ boite(222, 47, 155, 91, 15);
+ }
+ else
+ {
+ dessine(ades,0,12);
+ ecrf1();
+ if ((caff< 30) || (caff> 32))
+ {
+ for( cx= 1; cx <= 6; cx ++)
+ if (ord(touv[cx])!= 0) aniof(1,ord(touv[cx]));
+ if (caff== 13)
+ {
+ if (s.iboul== 141) aniof(1,7);
+ if (s.ibag== 159) aniof(1,6);
+ }
+ if ((caff== 14) && (s.icave== 151)) aniof(1,2);
+ if ((caff== 17) && (s.ivier== 143)) aniof(1,1);
+ if ((caff== 24) && (s.ipuit!= 0)) aniof(1,1);
+ }
+ if (caff< 26) musique(1);
+ }
+ }
+}
+
+
+
diff --git a/engines/mortevielle/mor2.h b/engines/mortevielle/mor2.h
new file mode 100644
index 0000000000..8edf601458
--- /dev/null
+++ b/engines/mortevielle/mor2.h
@@ -0,0 +1,764 @@
+const array<1,11,integer> men
+ = {{ scacher, attacher, defoncer, dormir,
+ entrer, fermer, frapper, manger,
+ mettre, ouvrir, sortir }};
+
+void tinke()
+{
+ const char m1[] = "Mince! Vous entendez du bruit...";
+ const char d1[] = " | Vous devriez avoir remarqu‚| ";
+ const char d2[] = "% des indices...";
+ const char d3 = '[';
+ const char d4 = ']';
+ const char d5 = '1';
+ const char d6[] = "OK";
+ integer cx,cy,haz,nh,cf,j,h,m,cd;
+ varying_string<3> stpo;
+ boolean am;
+
+ anyone= false;
+ calch(j,h,m);
+ if (j!= jou)
+ {
+ jou= j;
+ cx=0;
+ do {
+ cx=cx+1;
+ if (nbrepm[cx]!= 0) nbrepm[cx]= nbrepm[cx]- 1;
+ nbrep[cx]= 0;
+ } while (!(cx==8));
+ }
+ if ((h> heu) || ((h== 0) && (heu== 23)))
+ {
+ heu= h;
+ min= 0;
+ pendule();
+ cf= 0;
+ for( cx= 1; cx <= 10; cx ++) if (s.pourc[cx]== '*') cf= cf+ 1;
+ if (cf==10) stpo="10";
+ else stpo=chr(cf+48);
+ stpou= string(d3)+ d5+ d4+ d3+ d1+ stpo+ '0'+ d2+ d4+ d3+ d6+ d4;
+ }
+ if (m> min)
+ {
+ min= 30;
+ pendule();
+ }
+ if (y_s<12) return;
+ if (! blo)
+ {
+ if ((h== 12) || ((h> 18) && (h< 21)) || ((h>= 0) && (h< 7)))
+ t= ti2; else t= ti1;
+ cf= s.conf;
+ if ((cf> 33) && (cf< 66)) t= t- (t / 3);
+ if (cf> 65) t= t- ((t / 3)* 2);
+ nh= readclock();
+ if ((nh- mh)> t)
+ {
+ am= active_menu;
+ erase_menu();
+ jh= jh+ ((nh- mh)/ t);
+ mh= nh;
+ switch (li) {
+ case 1:case 4 : pl1(cf); break;
+ case 2 : pl2(cf); break;
+ case 5 : pl5(cf); break;
+ case 6:case 8 : pl6(cf); break;
+ case 9 : pl9(cf); break;
+ case 10 : pl10(cf); break;
+ case 11 : pl11(cf); break;
+ case 12 : pl12(cf); break;
+ case 13:case 14 : pl13(cf); break;
+ case 15:case 26 : pl15(cf); break;
+ case 20 : pl20(cf); break;
+ }
+ if ((mpers!= 0) && (ipers!= 10)) mpers= ipers;
+ if ((mpers== 0) && (ipers> 0))
+ if ((s.mlieu== 13) || (s.mlieu== 14)) cavegre(); else
+ if (ipers== 10)
+ {
+ ipers= 0;
+ if (! brt)
+ {
+ brt= true;
+ hdb= readclock();
+ haz= hazard(1,5);
+ if (haz< 5)
+ {
+ clsf3();
+ ecrf2();
+ ecr3(m1);
+ haz= (hazard(0, 4))- 2;
+ parole(1, haz, 1);
+ clsf3();
+ }
+ }
+ }
+ if (am) draw_menu();
+ }
+ }
+ hfb= readclock();
+ if ((brt) && ((hfb- hdb)> 17))
+ {
+ nouvp(li,cx);
+ brt= false;
+ hdb= 0;
+ if ((s.mlieu> 0) && (s.mlieu< 10)) anyone= true;
+ }
+}
+
+void fenat(char ans)
+{
+ integer coul;
+
+ hide_mouse();
+ if (gd==cga) coul=2;
+ else if (gd==her) coul=1; else coul=12;
+ affcar(gd,306,193,coul,ord(ans));
+ boite(300, 191, 16, 8, 15);
+ show_mouse();
+}
+
+
+/* NIVEAU 8 */
+void afdes(integer ad)
+{
+ taffich();
+ dessin(ad);
+ okdes= false;
+}
+
+void tkey1(boolean d)
+{
+ boolean quest;
+ integer x,y,c;
+ integer key;
+
+ hide_mouse();
+ fenat('K');
+ while (keypressed()) key=testou();
+ do {
+ if (d) tinke();
+ quest=keypressed();
+ read_pos_mouse(x,y,c);
+ } while (!(quest || (c!=0) || (d && anyone)));
+ if (quest) key=testou();
+ clic=false;
+ show_mouse();
+}
+
+void tmlieu(integer mli)
+{
+ integer cx, j, i, tail;
+ str30 nomp;
+ phrase st;
+
+
+ if (mli== 26) mli= 15;
+ i=1;
+ while ((i<8) && (v_lieu[i][mli]!=0))
+ {
+ cx=v_lieu[i][mli];
+ deline(cx+c_tmlieu,st,tail);
+ nomp= delig;
+ while (length(nomp)<30) nomp=nomp+' ';
+ menut( depl[i], nomp);
+ i=i+1;
+ }
+ nomp= "* ";
+ for( cx= 7; cx >= i; cx --) menut( depl[cx], nomp);
+}
+
+
+/* NIVEAU 7 */
+void tlu(integer af,integer ob)
+{
+ caff= 32;
+ afdes(0);
+ repon(6,ob+ 4000);
+ repon(2,999);
+ tkey1(true);
+ caff= af;
+ msg[3]= no_choice;
+ crep= 998;
+}
+
+void delin(integer n)
+ {
+ phrase s;
+ integer t;
+
+ deline(n,s,t);
+ }
+
+void affrep()
+{
+ caff= s.mlieu;
+ crep= s.mlieu;
+}
+
+void mfouen()
+
+{
+ integer cx;
+
+ tmlieu(s.mlieu);
+ for( cx=1; cx <= 11; cx ++) menu_enable( men[cx]);
+/* menu_enable( scacher);
+ menu_enable(menup, attacher);
+ menu_enable(menup, defoncer);
+ menu_enable(menup, dormir);
+ menu_enable(menup, entrer);
+ menu_enable(menup, fermer);
+ menu_enable(menup, frapper);
+ menu_enable(menup, manger);
+ menu_enable(menup, mettre);
+ menu_enable(menup, ouvrir);
+ menu_enable(menup, sortir); */
+ menut( sonder, " sonder ");
+ menut( soulever, " soulever ");
+}
+
+void atf3f8(integer& key)
+ {
+ do {
+ key= testou();
+ } while (!((key==61) || (key==66)));
+ }
+
+/* NIVEAU 6 */
+
+void tperd()
+{
+ integer cx;
+
+ initouv();
+ ment= 0;
+ iouv= 0;
+ mchai= 0;
+ mfouen();
+ if (! blo) t11(21, cx);
+ perdu= true;
+ clsf1();
+ boite( 60, 35, 400, 50, 15);
+ repon(9,crep);
+ clsf2();
+ clsf3();
+ col= false;
+ syn= false;
+ okdes= false;
+}
+
+void tsort()
+{
+ integer cx;
+
+ if ((iouv> 0) && (s.mlieu!= 0))
+ if (s.conf< 50) s.conf= s.conf+ 2;
+ else s.conf= s.conf+ (s.conf / 10);
+ for( cx= 1; cx <= 7; cx ++) touv[cx]= chr(0);
+ ment= 0;
+ iouv= 0;
+ mchai= 0;
+ debloc(s.mlieu);
+}
+
+void st4(integer ob)
+{
+ crep= 997;
+ switch (ob) {
+ case 114 : crep=109; break;
+ case 110 : crep=107; break;
+ case 158 : crep=113; break;
+ case RANGE_5(152,156):case 150:
+ case 100:case 157:case 160:case 161 : tlu(caff,ob);
+ break;
+ }
+}
+
+void cherjer(integer ob, boolean& d)
+{
+ integer cx;
+
+ d= false;
+ for( cx= 1; cx <= 6; cx ++) d=(d || (ord(s.sjer[cx])== ob));
+ if (s.derobj== ob) d= true;
+}
+
+void st1sama()
+{
+ s.mlieu= 10;
+ affrep();
+}
+
+void modinv()
+{
+ integer cx, cy, tay, i, r;
+ phrase nom;
+ str30 nomp;
+
+ cy= 0;
+ for( cx=1; cx <= 6; cx ++)
+ if (s.sjer[cx]!= chr(0))
+ {
+ cy= succ(integer,cy);
+ r= (ord(s.sjer[cx])+ 400);
+ deline(r-501+c_st41,nom,tay);
+ nomp= delig;
+ menut( invt[cy], nomp);
+ menu_enable( invt[cx]);
+ }
+ if (cy<6)
+ for( cx=cy+1; cx <= 6; cx ++)
+ {
+ menut( invt[cx], " ");
+ menu_disable( invt[cx]);
+ }
+}
+
+void sparl(long_integer adr, long_integer rep)
+{
+ const array<1,8,integer> haut
+ = {{0,1,-3,6,-2,2,7,-1}};
+ integer key, ad, tay, repint;
+ phrase st;
+
+ repint=trunc(rep);
+ hide_mouse();
+ deline( repint+c_paroles,st,tay);
+ afftex(st,230,4,65,24,5);
+ f3f8();
+ /*boite(43,30,90,19,15);
+ gotoxy(7,5);
+ write('F3: Encore');
+ gotoxy(7,6);
+ write('F8: Stop');*/
+ key= 0;
+ do {
+ parole(repint, haut[caff- 69], 0);
+ atf3f8(key);
+ } while (!(key== 66));
+ hirs();
+ show_mouse();
+}
+
+void finfouil()
+ {
+ fouil= false;
+ obpart= false;
+ cs= 0;
+ is= 0;
+ mfouen();
+ }
+
+void mfoudi()
+{
+ integer cx;
+
+ for( cx= 1; cx <= 7; cx ++) menu_disable( depl[cx]);
+ for( cx=1; cx <= 11; cx ++) menu_disable( men[cx]);
+/* menu_disable(menup, scacher);
+ menu_disable(menup, attacher);
+ menu_disable(menup, defoncer);
+ menu_disable(menup, dormir);
+ menu_disable(menup, entrer);
+ menu_disable(menup, fermer);
+ menu_disable(menup, frapper);
+ menu_disable(menup, manger);
+ menu_disable(menup, mettre);
+ menu_disable(menup, ouvrir);
+ menu_disable(menup, sortir); */
+ menut( sonder, " -SUITE- ");
+ menut( soulever, " -STOP- ");
+}
+
+void mennor()
+{
+ menu_up(msg[3]);
+}
+
+void premtet()
+{
+ dessine(ades, 10, 80);
+ boite(18, 79, 155, 91, 15);
+}
+
+/* NIVEAU 5 */
+void ajchai()
+{
+ integer cx,cy,lderobj;
+
+
+ cy= (acha+ pred(integer,pred(integer,mchai)* 10));
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ } while (!((cx> 9) || (tabdon[cy+ cx]== 0)));
+ if (tabdon[cy+ cx]== 0)
+ {
+ lderobj= s.derobj;
+ tabdon[cy+ cx]=lderobj;
+ }
+ else crep= 192;
+}
+
+void ajjer(integer ob)
+{
+ integer cx;
+
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ } while (!((cx> 5) || (ord(s.sjer[cx])== 0)));
+ if (ord(s.sjer[cx])== 0)
+ {
+ s.sjer[(cx)]= chr(ob);
+ modinv();
+ }
+ else crep= 139;
+}
+
+void t1sama() /* On entre dans le manoir */
+{
+ integer j,h,m;
+ boolean d;
+
+ calch(j,h,m);
+ if ((h< 5) && (s.mlieu> 18))
+ {
+ cherjer(137,d);
+ if (! d) /* On n'a pas les cl‚s et il est tard */
+ {
+ crep= 1511;
+ tperd();
+ }
+ else st1sama();
+ }
+ else
+ if (! s.ipre) /* c'est votre premiŠre fois ? */
+ {
+ ipers= 255;
+ affper(ipers);
+ caff= 77;
+ afdes(0);
+ boite(223, 47, 155, 91, 15);
+ repon(2,33);
+ tkey1(false);
+ mennor();
+ hide_mouse();
+ hirs();
+ premtet();
+ sparl(0,140);
+ dessine_rouleau();
+ pendule();
+ show_mouse();
+ s.mlieu= 0;
+ affrep();
+ t5(10);
+ if (! blo) t11(0, m);
+ ipers= 0;
+ mpers= 0;
+ s.ipre= true;
+ /*chech;*/
+ }
+ else st1sama();
+}
+
+void t1vier()
+{
+ s.mlieu= 17;
+ affrep();
+}
+
+void t1neig()
+{
+ inei= inei+ 1;
+ if (inei> 2)
+ {
+ crep= 1506;
+ tperd();
+ }
+ else
+ {
+ okdes= true;
+ s.mlieu= 19;
+ affrep();
+ }
+}
+
+void t1deva()
+{
+ inei= 0;
+ s.mlieu= 21;
+ affrep();
+}
+
+void t1derr()
+{
+ s.mlieu = 22;
+ affrep();
+}
+
+void t1deau()
+{
+ crep = 1503;
+ tperd();
+}
+
+void tctrm()
+{
+ repon(2,(3000+ ctrm));
+ ctrm= 0;
+}
+
+
+void quelquun()
+
+{
+ integer haz,cx;
+
+ if (imen) erase_menu();
+ finfouil();
+ crep= 997;
+L1:
+ if (! cache)
+ {
+ if (crep== 997) crep= 138;
+ repon(2,crep);
+ if (crep== 138) parole(5, 2, 1); else parole(4, 4, 1);
+ if (iouv== 0) s.conf= s.conf+ 2; else
+ if (s.conf< 50) s.conf= s.conf+ 4; else
+ s.conf= s.conf+ (3* (s.conf / 10));
+ tsort();
+ tmlieu(15);
+ tip(ipers,cx);
+ caff= 69+ cx;
+ crep= caff;
+ msg[3]= discut;
+ msg[4]= disc[cx];
+ syn= true;
+ col= true;
+ }
+ else
+ {
+ haz= hazard(1, 3);
+ if (haz== 2)
+ {
+ cache= false;
+ crep= 137;
+ goto L1;
+ }
+ else
+ {
+ repon(2, 136);
+ haz= (hazard(0, 4))- 2;
+ parole(3, haz, 1);
+ clsf2();
+ person();
+ debloc(21);
+ affrep();
+ }
+ }
+ if (imen) draw_menu();
+}
+
+void tsuiv()
+{
+ integer cx,tbcl;
+ integer cl,cy;
+
+ cy= acha+ ((mchai- 1)* 10)- 1;
+ cx= 0;
+ do {
+ cx= cx+ 1;
+ cs= cs+ 1;
+ cl= cy+ cs;
+ tbcl= tabdon[cl];
+ } while (!((tbcl != 0) || (cs> 9)));
+ if ((tbcl != 0) && (cs< 11))
+ {
+ is= is+ 1;
+ caff= tbcl;
+ crep= caff+ 400;
+ if (ipers!= 0) s.conf= s.conf+ 2;
+ }
+ else
+ {
+ affrep();
+ finfouil();
+ if (cx> 9) crep= 131;
+ }
+}
+
+void tfleche()
+{
+ boolean qust;
+ char touch;
+ integer dummy,cd,xmo,ymo;
+
+ if (num== 9999) return;
+ fenat(chr(152));
+ rect= false;
+ do {
+ touch='\0';
+
+ do {
+ mov_mouse(qust,touch);
+ if (clic) rect=(x_s<256*res) && (y_s<176) && (y_s>12);
+ tinke();
+ } while (!(qust || rect || anyone));
+
+ if (qust && (touch=='\103')) dummy=do_alert(stpou,1);
+ } while (!((touch=='\73') || ((touch== '\104') && (x!= 0) && (y!=0)) ||
+ (anyone) || (rect)));
+ if (touch=='\73') iesc= true;
+ if (rect)
+ {
+ x=x_s;
+ y=y_s;
+ }
+}
+
+void tcoord(integer sx)
+
+ {
+ integer sy,ix,iy,cb,cy,ib;
+ integer a, b, atdon;
+
+
+ num= 0;
+ crep= 999;
+ a=0;
+ atdon=amzon+3;
+ cy= 0;
+ while (cy<caff)
+ {
+ a=a+tabdon[atdon];
+ atdon=atdon+4;
+ cy= succ(integer,cy);
+ }
+/* for cy:=0 to caff-1 do
+ a:=a+ tabdon[amzon+3+4*cy];
+ b:= peek(amzon+3+4*caff); */
+ b= tabdon[atdon];
+ if (b== 0) goto L1;
+ a= a+ fleche;
+ cb= 0;
+ for( cy= 0; cy <= (sx-2); cy ++)
+ {
+ ib= (tabdon[a+cb] << 8)+ tabdon[succ(integer,a+ cb)];
+ cb= cb+ (ib* 4)+ 2;
+ }
+ ib= (tabdon[a+cb] << 8)+ tabdon[succ(integer,a+ cb)];
+ if (ib== 0) goto L1;
+ cy= 1;
+ do {
+ cb= cb+ 2;
+ sx= tabdon[a+ cb] * res;
+ sy= tabdon[succ(integer,a+ cb)];
+ cb= cb+ 2;
+ ix= tabdon[a+ cb] * res;
+ iy= tabdon[succ(integer,a+ cb)];
+ cy= cy+ 1;
+ } while (!(((x>= sx) && (x<= ix) && (y>= sy) && (y<= iy))
+ || (cy> ib)));
+ if ((x>= sx) && (x<= ix) && (y>= sy) && (y<= iy))
+
+ {
+ num= cy- 1;
+ return;
+ }
+L1:
+ crep= 997;
+ }
+
+
+void st7(integer ob)
+{
+ crep= 183;
+ if ((ob== 116) || (ob== 144)) crep= 104;
+ if ((ob== 126) || (ob== 111)) crep= 108;
+ if (ob== 132) crep= 111;
+ if (ob== 142) crep= 112;
+ if (crep== 183) st4(ob);
+}
+
+void treg(integer ob)
+{
+ integer mdes;
+
+ mdes= caff;
+ caff= ob;
+ if (((caff> 29) && (caff< 33)) || (caff== 144) ||
+ (caff== 147) || (caff== 149) || (msg[4]== sregarder))
+ {
+ afdes(0);
+ if ((caff> 29) && (caff< 33)) repon(2,caff); else repon(2,(caff+ 400));
+ tkey1(true);
+ caff= mdes;
+ msg[3]= 0;
+ crep= 998;
+ }
+ else
+ {
+ obpart= true;
+ crep= caff+ 400;
+ mfoudi();
+ }
+}
+
+void avpoing(integer& ob)
+{
+ crep= 999;
+ if (s.derobj!= 0) ajjer(s.derobj);
+ if (crep!= 139)
+ {
+ modobj(ob+ 400);
+ s.derobj= ob;
+ ob= 0;
+ }
+}
+
+void rechai(integer& ch)
+{
+ integer cx;
+
+ cx= s.mlieu;
+ if (s.mlieu== 16) cx= 14;
+ ch= tabdon[achai+ (cx* 7)+ pred(integer,num)];
+}
+
+void t23coul(integer& l)
+{
+ boolean d;
+
+ cherjer(143,d);
+ l= 14;
+ if (! d)
+ {
+ crep= 1512;
+ tperd();
+ }
+}
+
+void maivid()
+{
+ s.derobj= 0;
+ modobj(500);
+}
+
+void st13(integer ob)
+{
+ if ((ob== 114) || (ob== 116) || (ob== 126) || (ob== 132) ||
+ (ob== 111) || (ob== 106) || (ob== 102) || (ob== 100) ||
+ (ob== 110) || (ob== 153) || (ob== 154) || (ob== 155) ||
+ (ob== 156) || (ob== 157) || (ob== 144) || (ob== 158) ||
+ (ob== 150) || (ob== 152)) crep= 999; else crep= 105;
+}
+
+void aldepl()
+{
+ integer dummy;
+
+ dummy=do_alert("[1][Alors, utilisez le menu DEP...][ok]",1);
+}
diff --git a/engines/mortevielle/mort.cpp b/engines/mortevielle/mort.cpp
new file mode 100644
index 0000000000..1fbd91c648
--- /dev/null
+++ b/engines/mortevielle/mort.cpp
@@ -0,0 +1,124 @@
+#include "ptoc.h"
+
+
+
+ /*$v-*/
+ /*$k-*/
+ /*$x-*/
+ /*$c-*/
+
+#include "var_mor.h" /* les variables */
+#include "keyboard.h" /* la gestion du clavier */
+#include "mouse.h" /* la souris */
+#include "level15.h" /* les fonctions de base */
+#include "droite.h" /* pour faire une droite */
+#include "boite.h"
+#include "sprint.h" /* l'affichage des textes */
+#include "outtext.h" /* fonctions sup‚rieures d'affichage */
+#include "parole.h" /* les fonctions de la parole */
+#include "alert.h"
+#include "parole2.h" /* les fonctions de la parole */
+ /* debug le debugging */
+#include "ques.h" /* les questions */
+#include "menu.h" /* les fonctions du menu */
+#include "mor.h" /* divers */
+#include "taffich.h" /* chargement des dessins */
+#include "ovd1.h" /* les fonctions sur disque 1 */
+#include "mor2.h" /* divers */
+#include "actions.h" /* les actions */
+#include "prog.h" /* fonctions toplevel */
+#include "disk.h" /* chargements et sauvegardes */
+
+/* ecrihexa utilitaire */
+
+void divers(integer np,boolean b)
+{
+ teskbd();
+ do {
+ parole(np, 0, 0);
+ atf3f8(key);
+ if (newgd!=gd)
+ {
+ gd=newgd;
+ hirs();
+ aff50(b);
+ }
+ } while (!(key== 66));
+}
+
+/* NIVEAU 0 */
+
+int main(int argc, const char* argv[])
+{
+/*init_debug;*/
+/* ecri_seg;*/
+ pio_initialize(argc, argv);
+ gd=cga;
+ newgd= gd;
+ zuul= false;
+ tesok= false;
+ chartex();
+ charpal();
+ charge_cfiph();
+ charge_cfiec();
+ zzuul(adcfiec+161,0,1644);
+ c_zzz= 1;
+ init_nbrepm();
+ init_mouse();
+/* crep:=memw[$7f00:0];
+ memw[$7f00:0]:= crep+1;
+ if (memw[$7f00:0]<> crep+1) then
+ begin
+ hirs;
+ show_mouse;
+ crep:=do_alert('[1][ 512 k minimum requis !!][OK]',1);
+ clrscr;
+ halt;
+ end;
+ if (Dseg+$1000>adbruit5) then
+ begin
+ hirs;
+ show_mouse;
+ crep:=do_alert('[1][ Il ne reste pas assez de |place m‚moire !!][OK]',1);
+ clrscr;
+ halt;
+ end;*/
+ init_lieu();
+ arret= false;
+ sonoff= false;
+ f2_all= false;
+ textcolor(9);
+ teskbd();
+ dialpre();
+ newgd= gd;
+ teskbd();
+ if (newgd!=gd) gd=newgd;
+ hirs();
+ ades= 0x7000;
+ aff50(false);
+ mlec= 0;
+ divers(142,false);
+
+ ani50();
+ divers(143,true);
+ suite();
+ music();
+ adzon();
+ takesav(0);
+ if (rech_cfiec) charge_cfiec();
+ for( crep=1; crep <= c_zzz; crep ++) zzuul(adcfiec+161,0,1644);
+ charge_bruit5();
+ init_menu();
+
+ theure();
+ dprog();
+ hirs();
+ dessine_rouleau();
+ show_mouse();
+ do { tjouer(); } while (!arret);
+ hide_mouse();
+ clrscr;
+/*out_debug;*/
+ return EXIT_SUCCESS;
+}
+
diff --git a/engines/mortevielle/mouse.h b/engines/mortevielle/mouse.h
new file mode 100644
index 0000000000..3f250d91e4
--- /dev/null
+++ b/engines/mortevielle/mouse.h
@@ -0,0 +1,469 @@
+const integer m_arrow = 0;
+const integer m_point_hand = 1;
+
+boolean int_m,
+clic;
+
+integer m_show,
+x_s,
+y_s,
+p_o_s,
+mouse_shwn;
+
+matrix<0,5,0,11,integer> s_s;
+
+
+void init_mouse()
+{
+ integer i, j;
+ registres reg;
+
+ mouse_shwn= 0;
+ x_s= 0;
+ y_s= 0;
+ p_o_s= 0;
+ /*int_m:= False;*/
+ clic= false;
+ m_show= m_arrow;
+ if ((memw[0xcc]==0) && (memw[0xce]==0)) int_m= false;
+ if (int_m)
+ {
+ reg.ax= 0;
+ intr(0x33,reg);
+ int_m= (reg.ax==-1);
+ if (int_m)
+ {
+ {
+ reg.ax=4;
+ reg.cx=0;
+ reg.dx=0;
+ }
+ intr(0x33,reg);
+ }
+ }
+}
+
+/*procedure change_mouse( t : integer );
+begin
+ m_show:= t;
+end;*/
+
+/*procedure dessine_souris(xf,yf:integer);
+ var x, xx, y :integer;
+begin
+ case m_show of
+ m_arrow : begin
+ affput(2,Gd,xf,yf,0,0);
+ end;
+ end;
+end; */
+
+void hide_mouse()
+{
+ integer i,j,k,ps,ds;
+ boolean imp;
+
+ mouse_shwn = pred(integer,mouse_shwn);
+ if (mouse_shwn==0)
+ {
+ imp= odd(y_s);
+ j=p_o_s;
+ switch (gd) {
+ case cga : {
+ k=0;
+ j=((cardinal)y_s >> 1) * 80+ ((cardinal)x_s >> 2);
+ do {
+ memw[0xb000+j]=s_s[0][k];
+ memw[0xb800+j+2]=s_s[1][k];
+ memw[0xba00+j]=s_s[2][k];
+ memw[0xba00+j+2]=s_s[3][k];
+ j=j+80;
+ k= succ(integer,k);
+ } while (!(k>=5));
+ }
+ break;
+ case ams : {
+ for( i=0; i <= 3; i ++)
+ {
+ port[0x3dd]= 1 << i;
+ k=0;
+ j=p_o_s;
+ do {
+ if (imp)
+ {
+ memw[0xb800+j]=s_s[i][k];
+ j=j+80-0x2000;
+ }
+ else
+ {
+ memw[0xb800+j]=s_s[i][k];
+ j=j+0x2000;
+ }
+ imp=! imp;
+ k= succ(integer,k);
+ } while (!(k>=8));
+ }
+ }
+ break;
+ case ega : {
+ port[0x3c4]=2;
+ port[0x3ce]=8;
+ port[0x3cf]=255;
+ i= 0;
+ do {
+ port[0x3c5]= 1 << i;
+ k=0;
+ j=p_o_s;
+ do {
+ ps=mem[0xa000+j];
+ mem[0xa000+j]=lo(s_s[i][k]);
+ ps=mem[0xa000+j+1];
+ mem[0xa000+j+1]=hi(s_s[i][k]);
+ j=j+80;
+ k= succ(integer,k);
+ } while (!(k>=8));
+ i= i+1;
+ } while (!(i==4));
+ }
+ break;
+ case her : {
+ j= ((cardinal)y_s >> 1) *80+((cardinal)x_s >> 3);
+ for( i=0; i <= 5; i ++)
+ {
+ for( k=0; k <= 3; k ++) memw[0xb000+k*0x200+j]=s_s[i][k];
+ j=j+80;
+ }
+ }
+ break;
+ case tan : {
+ j= ((cardinal)y_s >> 2) *160+((cardinal)x_s >> 1);
+ k=0;
+ do {
+ for( i=0; i <= 3; i ++)
+ {
+ memw[0xb800+0x200*i+j]=s_s[k][i+(k << 2)];
+ memw[0xb800+0x200*i+j+2]=s_s[k+3][i+(k << 2)];
+ }
+ j=j+160;
+ k= succ(integer,k);
+ } while (!(k==3));
+ }
+ break;
+
+ } /* case Gd */
+ }
+}
+
+void show_mouse()
+{
+ integer i, j, k, l,
+ ps,ds;
+ boolean imp;
+ char c;
+
+ mouse_shwn = mouse_shwn +1;
+ if (mouse_shwn!=1) return;
+ j=p_o_s;
+ imp= odd(y_s);
+ i=x_s & 7;
+ switch (gd) {
+ case cga : {
+ k=0;
+ j=((cardinal)y_s >> 1) * 80+ ((cardinal)x_s >> 2);
+ do {
+ s_s[0][k]=memw[0xb800+j];
+ s_s[1][k]=memw[0xb800+j+2];
+ s_s[2][k]=memw[0xba00+j];
+ s_s[3][k]=memw[0xba00+j+2];
+ j=j+80;
+ k= succ(integer,k);
+ } while (!(k>=5));
+ }
+ break;
+ case ams : {
+ for( i=0; i <= 3; i ++)
+ {
+ j=p_o_s;
+ imp= odd(y_s);
+ port[0x3de]= i;
+ k=0;
+ do {
+ if (imp)
+ {
+ s_s[i][k]=memw[0xb800+j];
+ j=j+80-0x2000;
+ }
+ else
+ {
+ s_s[i][k]=memw[0xb800+j];
+ j=j+0x2000;
+ }
+ imp=! imp;
+ k= succ(integer,k);
+ } while (!(k>=8));
+ }
+ }
+ break;
+ case ega : {
+ port[0x3ce]=4;
+ l= 0;
+ do {
+ port[0x3cf]= l;
+ k=0;
+ j=p_o_s;
+ do {
+ s_s[l][k]= mem[0xa000+j]+(mem[0xa000+succ(integer,j)] << 8);
+ j=j+80;
+ k= succ(integer,k);
+ } while (!(k>=8));
+ l= l+1;
+ } while (!(l==4));
+ }
+ break;
+ case her : {
+ j= ((cardinal)y_s >> 1) *80+((cardinal)x_s >> 3);
+ for( i=0; i <= 5; i ++)
+ {
+ for( k=0; k <= 3; k ++) s_s[i][k]=memw[0xb000+k*0x200+j];
+ j=j+80;
+ }
+ }
+ break;
+ case tan : {
+ j= ((cardinal)y_s >> 2)*160+((cardinal)x_s >> 1);
+ k=0;
+ do {
+ for( i=0; i <= 3; i ++)
+ {
+ s_s[k][i+(k << 2)]=memw[0xb800+0x200*i+j];
+ s_s[k+3][i+(k << 2)]=memw[0xb800+0x200*i+j+2];
+ }
+ j=j+160;
+ k= succ(integer,k);
+ } while (!(k==3));
+ }
+ break;
+ } /* case Gd */
+ affput(2,gd,x_s,y_s,0,0);
+}
+
+void pos_mouse(integer x,integer y)
+{
+ registres reg;
+
+ if (x>314*res) x=314*res;
+ else if (x<0) x=0;
+ if (y>199) y=199;
+ else if (y<0) y=0;
+ if ((x==x_s) && (y==y_s)) return;
+ if (int_m)
+ {
+ {
+ reg.ax=4;
+ reg.cx=x;
+ reg.dx=y;
+ }
+ intr(0x33,reg);
+ }
+ hide_mouse();
+ x_s=x;
+ y_s=y;
+ switch (gd) {
+ case ams : {
+ p_o_s=((cardinal)y_s >> 1)*80+((cardinal)x_s >> 3)+(y_s & 1)*0x2000;
+ }
+ break;
+ /*cga : begin
+ P_O_S:=(Y_S shr 1)*80+X_S shr 2+(Y_S and 1)*$2000;
+ end;*/
+ case ega : {
+ p_o_s=y_s*80+((cardinal)x_s >> 3);
+ }
+ break;
+ } /* case Gd */
+ show_mouse();
+}
+
+void read_pos_mouse(integer& x,integer& y,integer& c)
+{
+ registres reg;
+
+ if (int_m)
+ {
+ reg.ax=3;
+ intr(0x33,reg);
+ x=reg.cx;
+ y=reg.dx;
+ c=reg.bx;
+ }
+ else
+ {
+ c=0;
+ x=x_s;
+ y=y_s;
+ }
+}
+
+void mov_mouse(boolean& funct, char& key)
+ {
+ boolean p_key;
+ char in1, in2;
+ integer x,y,cx,cy,cd;
+ registres reg;
+
+ if (int_m)
+ {
+ reg.ax=3;
+ intr(0x33,reg);
+ x=reg.cx;
+ y=reg.dx;
+ cd=reg.bx;
+ pos_mouse(x,y);
+ if (cd!=0)
+ {
+ clic=true;
+ return;
+ }
+ }
+ funct=false;
+ key='\377';
+ p_key=keypressed();
+ while (p_key)
+ {
+ input >> kbd >> in1;
+ read_pos_mouse(cx, cy, cd);
+ switch (upcase(in1)) {
+ case '4' : cx= cx - 8; break;
+ case '2' : cy= cy + 8; break;
+ case '6' : cx= cx + 8; break;
+ case '8' : cy= cy - 8; break;
+ case '7' : {
+ cy=1;
+ cx=1;
+ }
+ break;
+ case '1' : {
+ cx=1;
+ cy=190;
+ }
+ break;
+ case '9' : {
+ cx=315*res;
+ cy=1;
+ }
+ break;
+ case '3' : {
+ cy=190;
+ cx=315*res;
+ }
+ break;
+ case '5' : {
+ cy=100;
+ cx=155*res;
+ }
+ break;
+ case ' ': case '\15' : {
+ clic=true;
+ return;
+ }
+ break;
+ case '\33' : {
+ p_key=keypressed();
+ if (p_key)
+ {
+ input >> kbd >> in2;
+ switch (in2) {
+ case 'K' : cx= pred(integer,cx); break;
+ case 'P' : cy= succ(integer,cy); break;
+ case 'M' : cx= cx + 2; break;
+ case 'H' : cy= pred(integer,cy); break;
+ case RANGE_10(';','D') : {
+ funct= true;
+ key=in2;
+ return;
+ }
+ break;
+ case 'G' : {
+ cx=cx-1;
+ cy=cy-1;
+ }
+ break;
+ case 'I' : {
+ cx=cx+1;
+ cy=cy-1;
+ }
+ break;
+ case 'O' : {
+ cx=cx-1;
+ cy=cy+1;
+ }
+ break;
+ case 'Q' : {
+ cx=cx+1;
+ cy=cy+1;
+ }
+ break;
+ } /* case */
+ }
+ }
+ break;
+ case 'I' : {
+ cx= res*32;
+ cy= 8;
+ }
+ break;
+ case 'D' : {
+ cx= 80*res;
+ cy= 8;
+ }
+ break;
+ case 'A' : {
+ cx= 126*res;
+ cy= 8;
+ }
+ break;
+ case 'S' : {
+ cx= 174*res;
+ cy= 8;
+ }
+ break;
+ case 'P' : {
+ cx= 222*res;
+ cy= 8;
+ }
+ break;
+ case 'F' : {
+ cx= res*270;
+ cy= 8;
+ }
+ break;
+ case '\23' : {
+ sonoff= ! sonoff;
+ return;
+ }
+ break;
+ case '\26' : {
+ zuul=true;
+ return;
+ }
+ break;
+ case '\24' : { /* ^T => mode tandy */
+ funct= true;
+ key= '\11';
+ }
+ break;
+ case '\10' : { /* ^H => mode Hercule */
+ funct= true;
+ key= '\7';
+ }
+ break;
+ case '\1':case '\3':case '\5' : {
+ funct= true;
+ key=in1;
+ }
+ break;
+ }
+ pos_mouse(cx, cy);
+ p_key=keypressed();
+ }
+ }
diff --git a/engines/mortevielle/outtext.h b/engines/mortevielle/outtext.h
new file mode 100644
index 0000000000..5bd4fd2809
--- /dev/null
+++ b/engines/mortevielle/outtext.h
@@ -0,0 +1,205 @@
+str255 delig;
+const array<0,31,byte> tabdr
+ = {{ 32, 101, 115, 97, 114, 105, 110,
+ 117, 116, 111, 108, 13, 100, 99,
+ 112, 109, 46, 118, 130, 39, 102,
+ 98, 44, 113, 104, 103, 33, 76,
+ 85, 106, 30, 31 }};
+
+
+const array<0,31,byte> tab30
+ = {{ 69, 67, 74, 138, 133, 120, 77, 122,
+ 121, 68, 65, 63, 73, 80, 83, 82,
+ 156, 45, 58, 79, 49, 86, 78, 84,
+ 71, 81, 64, 66, 135, 34, 136, 91 }};
+
+
+
+const array<0,31,byte> tab31
+ = {{ 93, 47, 48, 53, 50, 70, 124, 75,
+ 72, 147, 140, 150, 151, 57, 56, 51,
+ 107, 139, 55, 89, 131, 37, 54, 88,
+ 119, 0, 0, 0, 0, 0, 0, 0 }};
+
+void deline( integer num , phrase& l , integer& tl );
+
+static void cinq_huit( char& c, integer& ind, byte& pt, boolean& the_end)
+ {
+ const array<0,31,char> rap
+ = {{ ',', ':', '@', '!', '?', '-', '‡',
+ ' ', '…', 'ƒ', '‚', 'Š', 'ˆ', '/',
+ '‹', 'Œ', '¢', '\47', '“', '"', '—',
+ '–', '0', '1', '2', '3', '4', '5',
+ '6', '7', '8', '9'}};
+ integer oct,ocd;
+
+ /* 5-8 */
+ oct=t_mot[ind];
+ oct=(cardinal)(oct << (16-pt)) >> (16-pt);
+ if (pt<6)
+ {
+ ind=ind+1;
+ oct=oct << (5-pt);
+ pt=pt+11;
+ oct=oct | ((cardinal)t_mot[ind] >> pt);
+ }
+ else
+ {
+ pt=pt-5;
+ oct=(cardinal)oct >> pt;
+ }
+
+ switch (oct) {
+ case 11 : {
+ c= '$';
+ the_end= true;
+ }
+ break;
+ case 30:case 31 : {
+ ocd=t_mot[ind];
+ ocd=(cardinal)(ocd << (16-pt)) >> (16-pt);
+ if (pt<6)
+ {
+ ind=ind+1;
+ ocd=ocd << (5-pt);
+ pt=pt+11;
+ ocd=ocd | ((cardinal)t_mot[ind] >> pt);
+ }
+ else
+ {
+ pt=pt-5;
+ ocd=(cardinal)ocd >> pt;
+ }
+ if (oct==30) c=chr(tab30[ocd]);
+ else c=chr(tab31[ocd]);
+ if (c=='\0')
+ {
+ the_end=true;
+ c='#';
+ }
+ }
+ break;
+ default: c=chr(tabdr[oct]);
+ }
+ } /* 5-8 */
+
+void deline( integer num , phrase& l , integer& tl )
+ {
+ integer i,j,ts;
+ char let;
+ byte ps, k;
+ boolean the_end;
+
+ /* DETEX */
+ /*debug(' => DeLine');*/
+ delig="";
+ ts= t_rec[num].indis;
+ ps= t_rec[num].point;
+ i=ts;
+ tl=1;
+ j=1;
+ k=ps;
+ the_end=false;
+ do {
+ cinq_huit(let,i,k, the_end);
+ l[j]=let;
+ if (j<254) delig=delig+let;
+ j=j+1;
+ } while (!the_end);
+ tl=j-1;
+ if (tl<255) delig=copy(delig,1,tl-1); /* enleve le $ */
+ } /* DETEX */
+
+
+void afftex( phrase ch, integer x,integer y,integer dx,integer dy, integer typ);
+
+
+static integer l_motsuiv(integer p, phrase& ch, integer& tab)
+ {
+ integer c;
+
+ integer l_motsuiv_result;
+ c=p;
+ while (! (set::of(' ','$','@', eos).has(ch[p]))) p=p+1;
+ l_motsuiv_result=tab*(p-c);
+ return l_motsuiv_result;
+ }
+
+void afftex( phrase ch, integer x,integer y,integer dx,integer dy, integer typ)
+ {
+ boolean the_end;
+ char touch;
+ integer xf,yf;
+ integer xc,yc;
+ integer tab, p;
+ varying_string<255> s;
+ integer i,j,nt;
+
+
+/* debug(' .. Afftex');*/
+ putxy(x,y);
+ if (res==1) tab=10; else tab=6;
+ dx= dx * 6;
+ dy= dy * 6;
+ xc= x;
+ yc= y;
+ xf= x+dx;
+ yf= y+dy;
+ p= 1;
+ the_end=(ch[p]=='$');
+ s="";
+ while (! the_end)
+ {
+ switch (ch[p]) {
+ case '@' : {
+ writeg(s,typ);
+ s="";
+ p=p+1;
+ xc=x;
+ yc=yc+6;
+ putxy(xc,yc);
+ }
+ break;
+ case ' ' : {
+ s=s+' ';
+ xc=xc+tab;
+ p=p+1;
+ if (l_motsuiv(p, ch, tab)+xc > xf)
+ {
+ writeg(s,typ);
+ s="";
+ xc=x;
+ yc=yc+6;
+ if (yc>yf)
+ {
+ do {; } while (!keypressed());
+ i=y;
+ do {
+ j=x;
+ do {
+ putxy(j,i);
+ writeg(" ",0);
+ j=j+6;
+ } while (!(j>xf));
+ i=i+6;
+ } while (!(i>yf));
+ yc=y;
+ }
+ putxy(xc,yc);
+ }
+ }
+ break;
+ case '$' : {
+ the_end= true;
+ writeg(s,typ);
+ }
+ break;
+ default:
+ {
+ s=s+ch[p];
+ p=p+1;
+ xc=xc+tab;
+ }
+ } /* case */
+ }
+ }
diff --git a/engines/mortevielle/ovd1.h b/engines/mortevielle/ovd1.h
new file mode 100644
index 0000000000..b2f5f7962c
--- /dev/null
+++ b/engines/mortevielle/ovd1.h
@@ -0,0 +1,347 @@
+void dem2()
+{
+ untyped_file f;
+ integer k;
+
+ /* -- demande de disk 2 -- */
+ while (ioresult!=0);
+ assign(f,"mort.001");
+ /*$i-*/
+ reset(f);
+ while (ioresult!=0)
+ {
+ show_mouse();
+ k= do_alert(al_mess2,1);
+ hide_mouse();
+ reset(f);
+ }
+ close(f);
+}
+
+void ani50()
+ {
+ crep= animof(1,1);
+ pictout(adani,crep,63,12);
+ crep= animof(2,1);
+ pictout(adani,crep,63,12);
+ f2_all= (res==1);
+ repon(2, c_paroles+143);
+ }
+
+/*overlay procedure apzuul;
+ begin
+ if (c_zzz=1) or (c_zzz=2) then
+ begin
+ zzuul(adcfiec+161,0,1644);
+ c_zzz:=succ(c_zzz);
+ end;
+ end;*/
+
+/* overlay */ void aff50(boolean c)
+ {
+ integer k;
+
+ caff= 50;
+ maff=0;
+ taffich();
+ dessine(ades,63,12);
+ if (c) ani50();
+ else repon(2, c_paroles+142);
+ f3f8();
+ }
+
+/* overlay */ void init_menu()
+ {
+ integer i, j, tai;
+ phrase st;
+ untyped_file f;
+
+ assign(f,"menufr.mor");
+ /*$i-*/
+ reset(f,144);
+ blockread(f,lettres,1);
+ close(f);
+ /* ---- Demande de changement de disquette ---- */
+ dem2();
+
+
+ for( i= 1; i <= 8; i ++)
+ inv[i]= "* ";
+ inv[7]= "< -*-*-*-*-*-*-*-*-*- ";
+ for( i= 1; i <= 7; i ++)
+ dep[i]= "* ";
+ i= 1;
+ do {
+ deline(i+c_action,st,tai);
+ act[i]= delig + " ";
+ if (i<9)
+ {
+ if (i<6)
+ {
+ deline(i+c_saction,st,tai);
+ self_[i]= delig + " ";
+ }
+ deline(i+c_dis,st,tai);
+ dis[i]= delig+ ' ';
+ }
+ i= succ(integer,i);
+ } while (!(i== 22));
+ for( i= 1; i <= 8; i ++)
+ {
+ disc[i]=0x500+i;
+ if (i<8) depl[i]=0x200+i;
+ invt[i]=0x100+i;
+ if (i>6) menu_disable(invt[i]);
+ }
+ msg3=no_choice;
+ msg4=no_choice;
+ msg[3]=no_choice;
+ msg[4]=no_choice;
+ clic=false;
+ }
+
+
+/* overlay */ void charpal()
+{
+ file<tabdb> f;
+ file<tfxx> ft;
+ integer i,j,k;
+ file<byte> fb;
+ byte b;
+
+ assign(ft,"fxx.mor");
+ /*$i-*/
+ reset(ft);
+ if (ioresult!=0)
+ {
+ caff=do_alert(err_mess,1);
+ exit(0);
+ }
+ ft >> l;
+ close(ft);
+ assign(f,"plxx.mor");
+ reset(f);
+ for( i= 0; i <= 90; i ++) f >> tabpal[i];
+ close(f);
+ assign(fb, "cxx.mor");
+ reset(fb);
+ for( j=0; j <= 90; j ++)
+ {
+ fb >> palcga[j].p;
+ for( i=0; i <= 15; i ++)
+ {
+ nhom& with = palcga[j].a[i];
+
+ fb >> b;
+ with.n=(cardinal)b >> 4;
+ with.hom[0]= ((cardinal)b >> 2) & 3;
+ with.hom[1]= b & 3;
+ }
+ }
+ palcga[10].a[9]= palcga[10].a[5];
+ for( j=0; j <= 14; j ++)
+ {
+ fb >> tpt[j].tax;
+ fb >> tpt[j].tay;
+ for( i=1; i <= 20; i ++)
+ for( k=1; k <= 20; k ++)
+ fb >> tpt[j].des[i][k];
+ }
+ close(fb);
+}
+
+/* overlay */ void chartex()
+{
+ integer i;
+ untyped_file fibyte;
+ phrase s;
+
+/* debug('o3 chartex'); */
+ i=0;
+ assign(fibyte,"TXX.INP");
+ /*$i-*/
+ reset(fibyte);
+ blockread(fibyte,t_mot,125);
+ close(fibyte);
+ assign(sauv_t,"TXX.NTP");
+ reset(sauv_t);
+ do {
+ sauv_t >> t_rec[i];
+ i=i+1;
+ } while (!(eof(sauv_t)));
+ close(sauv_t);
+ deline(578,s,i);
+ al_mess= delig;
+ deline(579,s,i);
+ err_mess= delig;
+ deline(580,s,i);
+ ind_mess= delig;
+ deline(581,s,i);
+ al_mess2= delig;
+}
+
+/* overlay */ void dialpre()
+
+{
+ integer cy, tay;
+ phrase st;
+ real ix;
+ char ch;
+
+
+ /* debug('o3 dialpre'); */
+ cy=0;
+ clrscr;
+ textcolor(9);
+ do {
+ cy= cy+1;
+ deline( cy+c_dialpre,st,tay);
+ gotoxy(40-tay / 2,wherey+1);
+ output << delig;
+ } while (!(cy==20));
+ ix=0;
+ do {
+ ix= ix+1;
+ } while (!(keypressed() | (ix==5e5)));
+ crep= 998;
+ textcolor(1);
+ gotoxy(1,21); clreol;
+ gotoxy(1,23);
+ output << "CARTE GRAPHIQUE CGA EGA HERCULE/AT&T400 TANDY AMSTRAD1512";
+ gotoxy(12,24);
+ output << "Ctrl C E H T A";
+ do {
+ input >> kbd >> ch;
+ } while (!(set::of('\1','\3','\5','\24','\10', eos).has(ch)));
+ switch (ch) {
+ case '\1':case '\3':case '\5' : gd= (cardinal)ord(ch) >> 1; break;
+ case '\10' : gd= her; break;
+ case '\24' : gd= tan; break;
+ }
+ gotoxy(1,24);
+ clreol;
+ gotoxy(1,23);
+ clreol;
+ gotoxy(26,23);
+ output << "Jeu au Clavier / … la Souris";
+ textcolor(4);
+ gotoxy(33,23); output << 'C';
+ gotoxy(48,23); output << 'S';
+ do {
+ input >> kbd >> ch;
+ } while (!(set::of('C','S', eos).has(upcase(ch))));
+ int_m= (upcase(ch)=='S');
+}
+
+/* overlay */ void init_lieu()
+{
+ file<tab_mlieu> f_lieu;
+
+/* debug('o3 init_lieu'); */
+ assign(f_lieu,"MXX.mor");
+ /*$i-*/
+ reset(f_lieu);
+ f_lieu >> v_lieu;
+ close(f_lieu);
+}
+
+
+/* overlay */ void music()
+{
+ untyped_file fic;
+ integer k;
+ boolean fin;
+ char ch;
+ real x,y;
+
+
+ /* debug('o3 music'); */
+ if (sonoff) return;
+ rech_cfiec= true;
+ assign(fic,"mort.img");
+ /*$i-*/
+ reset(fic);
+ blockread(fic,mem[0x3800+0],500);
+ blockread(fic,mem[0x47a0+0],123);
+ close(fic);
+ demus(0x3800,0x5000,623);
+ addfix= (real)((tempo_mus-addv[1]))/256;
+ cctable(tbi);
+
+ fin=false;
+ k=0;
+ do {
+ fin= keypressed();
+ musyc( tbi, 9958 , tempo_mus);
+ k= k+1;
+ fin= fin | keypressed() | (k>=5);
+ } while (!fin);
+ while (keypressed()) input >> kbd >> ch;
+}
+
+
+/* overlay */ void charge_bruit5()
+ {
+ untyped_file f;
+
+ assign(f,"bruit5");
+ /*$i-*/
+ reset(f);
+ if (ioresult!=0)
+ {
+ caff=do_alert(err_mess,1);
+ exit(0);
+ }
+ blockread(f,mem[adbruit5+0],149);
+ /*blockread(f,mem[$5CB0:0],100);
+ blockread(f,mem[$3D1F:0],49);*/
+ close(f);
+ }
+
+/* overlay */ void charge_cfiec()
+ {
+ untyped_file f;
+
+ assign(f,"cfiec.mor");
+ /*$i-*/
+ reset(f);
+ blockread(f,mem[adcfiec+0],511);
+ blockread(f,mem[adcfiec+4088+0],311);
+ close(f);
+ rech_cfiec= false;
+ }
+
+
+/* overlay */ void charge_cfiph()
+ {
+ untyped_file f;
+
+ assign(f,"cfiph.mor");
+ /*$i-*/
+ reset(f,256);
+ blockread(f,t_cph,50);
+ close(f);
+ }
+
+
+/* overlay */ void suite()
+{
+ varying_string<25> cpr;
+
+ hirs();
+ repon(7,2035);
+ caff= 51;
+ taffich();
+ teskbd();
+ if (newgd!=gd) gd=newgd;
+ hirs();
+ dessine(ades,0,0);
+ gotoxy(20*pred(integer,res)+8,24);
+ textcolor(7);
+ cpr="COPYRIGHT 1989 : LANKHOR";
+ if (set::of(ega,ams,cga, eos).has(gd)) output << cpr;
+ else {
+ putxy(104+72*res,190);
+ writeg(cpr,0);
+ }
+}
diff --git a/engines/mortevielle/parole.h b/engines/mortevielle/parole.h
new file mode 100644
index 0000000000..0630c9b2b3
--- /dev/null
+++ b/engines/mortevielle/parole.h
@@ -0,0 +1,432 @@
+
+ void spfrac(integer wor)
+ {
+ c3.rep= (cardinal)wor >> 12;
+ if ((typlec==0) && (c3.code!=9))
+ if (((c3.code>4) && (c3.val!=20) && ! (set::of(3,6,9, eos).has(c3.rep))) ||
+ ((c3.code<5) && ! (set::of(19,22, eos).has(c3.val)) && ! (set::of(4,9, eos).has(c3.rep))))
+ c3.rep= c3.rep + 1;
+ c3.freq= ((cardinal)wor >> 6) & 7;
+ c3.acc= ((cardinal)wor >> 9) & 7;
+ }
+
+ void charg_car()
+ {
+ integer wor, int_;
+
+ wor= swap(memw[adword+ptr_word]);
+ int_= wor & 0x3f;
+ switch (int_) {
+ case 60 : {
+ c3.val= 32; /* " " */
+ c3.code= 9;
+ }
+ break;
+ case 61 : {
+ c3.val= 46; /* "." */
+ c3.code= 9;
+ }
+ break;
+ case 62 : {
+ c3.val= 35; /* "#" */
+ c3.code= 9;
+ }
+ break;
+ case RANGE_26(22,47) : {
+ int_= int_-22;
+ c3.val= int_;
+ c3.code= typcon[int_];
+ }
+ break;
+ case RANGE_9(48,56) : {
+ c3.val= int_-22;
+ c3.code= 4;
+ }
+ break;
+ case RANGE_8(14,21) : {
+ c3.val= int_;
+ c3.code= 6;
+ }
+ break;
+ case RANGE_14(0,13) : {
+ c3.val= int_;
+ c3.code= 5;
+ }
+ break;
+ }
+ spfrac(wor);
+ ptr_word= ptr_word+2;
+ }
+
+
+ void entroct( byte o)
+ {
+ mem[adtroct+ptr_oct]= o;
+ ptr_oct= ptr_oct+1;
+ }
+
+ void veracf(byte b)
+ {;
+ }
+
+/* overlay */ void cctable (tablint& t)
+ {
+ integer k;
+ array<0,256,real> tb;
+
+
+ tb[0]=0;
+ for( k=0; k <= 255; k ++)
+ {
+ tb[k+1]= addfix + tb[k];
+ t[255-k]=trunc(tb[k])+1;
+ }
+ }
+
+/* overlay */ void regenbruit()
+ {
+ integer i,j;
+
+ i= offsetb3+8590;
+ j= 0;
+ do {
+ t_cph[j]=memw[adbruit3+i];
+ i= i+2;
+ j= j+1;
+ } while (!(i>= offsetb3+8790));
+ }
+
+/* overlay */ void charge_son()
+ {
+ untyped_file f;
+
+ assign(f,"sonmus.mor");
+ reset(f);
+ blockread(f,mem[0x7414+0],273);
+ /*blockread(f,mem[adson+0],300);
+ blockread(f,mem[adson+2400+0],245);*/
+ demus(0x7414,adson,273);
+ close(f);
+ }
+
+/* overlay */ void charge_phbruit()
+ {
+ untyped_file f;
+
+ assign(f,"phbrui.mor");
+ reset(f);
+ blockread(f,t_cph,3);
+ close(f);
+ }
+
+/* overlay */ void charge_bruit()
+ {
+ untyped_file f;
+ integer j,i;
+
+ assign(f,"bruits");
+ reset(f);
+ blockread(f,mem[adbruit+0],250);
+ for( i=0; i <= 19013; i ++) mem[adbruit+32000+i]= mem[adbruit5+i];
+ blockread(f,mem[adbruit1+offsetb1],149);
+ close(f);
+ }
+
+/* overlay */ void trait_car()
+ {
+ byte d3;
+ integer d2, i;
+
+ switch (c2.code) {
+ case 9 : if (c2.val!=ord('#')) for( i=0; i <= c2.rep; i ++) entroct(c2.val); break;
+
+ case 5:case 6 : {
+ if (c2.code==6) d3= tabdph[(c2.val - 14) << 1];
+ else d3= null;
+ if (c1.code>=5)
+ {
+ veracf(c2.acc);
+ if (c1.code==9)
+ {
+ entroct(4);
+ if (d3==null) entroct(c2.val);
+ else entroct(d3);
+ entroct(22);
+ }
+ }
+ switch (c2.rep) {
+ case 0 : {
+ entroct(0);
+ entroct(c2.val);
+ if (d3==null) if (c3.code==9) entroct(2);
+ else entroct(4);
+ else if (c3.code==9) entroct(0);
+ else entroct(1);
+ }
+ break;
+ case 4:case 5:case 6 : {
+ if (c2.rep!=4)
+ {
+ i= c2.rep-5;
+ do {
+ i= i-1;
+ entroct(0);
+ if (d3==null) entroct(c2.val);
+ else entroct(d3);
+ entroct(3);
+ } while (!(i<0));
+ }
+ if (d3==null)
+ {
+ entroct(4);
+ entroct(c2.val);
+ entroct(0);
+ }
+ else
+ {
+ entroct(0);
+ entroct(c2.val);
+ entroct(3);
+ }
+ }
+ break;
+ case 7:case 8:case 9 : {
+ if (c2.rep!=7)
+ {
+ i= c2.rep-8;
+ do {
+ i= i-1;
+ entroct(0);
+ if (d3==null) entroct(c2.val);
+ else entroct(d3);
+ entroct(3);
+ } while (!(i<0));
+ }
+ if (d3==null)
+ {
+ entroct(0);
+ entroct(c2.val);
+ entroct(2);
+ }
+ else
+ {
+ entroct(0);
+ entroct(c2.val);
+ entroct(0);
+ }
+ }
+ break;
+ case 1:case 2:case 3 : {
+ if (c2.rep!=1)
+ {
+ i= c2.rep-2;
+ do {
+ i= i-1;
+ entroct(0);
+ if (d3==null) entroct(c2.val);
+ else entroct(d3);
+ entroct(3);
+ } while (!(i<0));
+ }
+ entroct(0);
+ entroct(c2.val);
+ if (c3.code==9) entroct(0);
+ else entroct(1);
+ }
+ break;
+ } /* case c2.rep */
+ }
+ break;
+
+ case 2:case 3 : {
+ d3= c2.code+5; /* 7 ou 8 => voyelle correspondante */
+ if (c1.code>4)
+ {
+ veracf(c2.acc);
+ if (c1.code==9)
+ {
+ entroct(4);
+ entroct(d3);
+ entroct(22);
+ }
+ }
+ i=c2.rep;
+ if (i!=0)
+ {
+ do {
+ i=i-1;
+ entroct(0);
+ entroct(d3);
+ entroct(3);
+ } while (!(i<=0));
+ }
+ veracf(c3.acc);
+ if (c3.code==6)
+ {
+ entroct(4);
+ entroct(tabdph[(c3.val-14) << 1]);
+ entroct(c2.val);
+ }
+ else
+ {
+ entroct(4);
+ if (c3.val==4) entroct(3);
+ else entroct(c3.val);
+ entroct(c2.val);
+ }
+ }
+ break;
+ case 0:case 1 : {
+ veracf(c2.acc);
+ switch (c3.code) {
+ case 2 : d2= 7; break;
+ case 3 : d2= 8; break;
+ case 6 : d2= tabdph[(c3.val-14) << 1]; break;
+ case 5 : d2= c3.val; break;
+ default: d2=10;
+ } /* case c3.code */
+ d2= d2 *26 + c2.val;
+ if (tnocon[d2]==0) d3=2;
+ else d3=6;
+ if (c2.rep>=5)
+ {
+ c2.rep=c2.rep-5;
+ d3= 8-d3; /* echange 2 et 6 */
+ }
+ if (c2.code==0)
+ {
+ i=c2.rep;
+ if (i!=0)
+ {
+ do {
+ i=i-1;
+ entroct(d3);
+ entroct(c2.val);
+ entroct(3);
+ } while (!(i<=0));
+ }
+ entroct(d3);
+ entroct(c2.val);
+ entroct(4);
+ }
+ else
+ {
+ entroct(d3);
+ entroct(c2.val);
+ entroct(3);
+ i=c2.rep;
+ if (i!=0)
+ {
+ do {
+ i=i-1;
+ entroct(d3);
+ entroct(c2.val);
+ entroct(4);
+ } while (!(i<=0));
+ }
+ }
+ if (c3.code==9)
+ {
+ entroct(d3);
+ entroct(c2.val);
+ entroct(5);
+ }
+ else
+ if (! (set::of(range(0,1),4, eos).has(c3.code)))
+ {
+ veracf(c3.acc);
+ switch (c3.code) {
+ case 3 : d2= 8; break;
+ case 6 : d2= tabdph[(c3.val-14) << 1]; break;
+ case 5 : d2= c3.val; break;
+ default: d2= 7;
+ } /* case c3.code */
+ if (d2==4) d2=3;
+ if (intcon[c2.val]!=0) c2.val= c2.val+1;
+ if ((c2.val==17) || (c2.val==18)) c2.val=16;
+ entroct(4);
+ entroct(d2);
+ entroct(c2.val);
+ }
+ }
+ break;
+ case 4 : {
+ veracf(c2.acc);
+ i=c2.rep;
+ if (i!=0)
+ {
+ do {
+ i=i-1;
+ entroct(2);
+ entroct(c2.val);
+ entroct(3);
+ } while (!(i<=0));
+ }
+ entroct(2);
+ entroct(c2.val);
+ entroct(4);
+ if (c3.code==9)
+ {
+ entroct(2);
+ entroct(c2.val);
+ entroct(5);
+ }
+ else
+ if (! (set::of(range(0,1),4, eos).has(c3.code)))
+ {
+ veracf(c3.acc);
+ switch (c3.code) {
+ case 3 : d2= 8; break;
+ case 6 : d2= tabdph[(c3.val-14) << 1]; break;
+ case 5 : d2= c3.val; break;
+ default: d2= 7;
+ } /* case c3.code */
+ if (d2==4) d2=3;
+ if (intcon[c2.val]!=0) c2.val= c2.val+1;
+ entroct(4);
+ entroct(d2);
+ entroct(tabdbc[((c2.val-26) << 1)+1]);
+ }
+ }
+ break;
+ } /* case c2.code */
+ }
+
+/*overlay function testprot : boolean;
+var
+ regs : registres;
+ buffer : array[0..511] of char;
+ i,j,k : integer;
+ st : phrase;
+ tay : integer;
+ test : array[0..2] of boolean;
+const
+ chaine : array[0..7] of char
+ = (' ','M','A','S','T','E','R',' ');
+
+begin
+ test[0]:= false;test[1]:=false;test[2]:=false;k:=0;
+ with regs do
+ begin
+ while (test[k]=false) and (k<2) do
+ begin
+ k:=k+1;
+ ax:=0;intr(19,regs);
+ ax:=$0201;cx:=$0001;dx:=$0100+k-1;es:=seg(buffer);bx:=ofs(buffer);
+ intr(19,regs);
+ test[k]:=true;
+ tesok:= true;
+ i:=0;
+ while (test[k]) and (i<19) do
+ begin
+ ax:=$0201;cx:=$2700+i;dx:=$0100+k-1;es:=seg(buffer);bx:=ofs(buffer);
+ intr(19,regs);if lo(flags) mod 2=1 then test[k]:=false;i:=i+1;
+ end;
+ for j:=0 to 7 do
+ if buffer[j+504]<>chaine[j] then test[k]:=false;
+ end;
+ end;
+ testprot:=(test[1] or test[2]);
+end;
+*/
+
diff --git a/engines/mortevielle/parole2.h b/engines/mortevielle/parole2.h
new file mode 100644
index 0000000000..6cdaa3e2b4
--- /dev/null
+++ b/engines/mortevielle/parole2.h
@@ -0,0 +1,103 @@
+ void rot_chariot()
+ {
+ c1= c2;
+ c2= c3;
+ {
+ c3.val= 32;
+ c3.code= 9;
+ }
+ }
+
+ void init_chariot()
+ {
+ {
+ c3.rep= 0;
+ c3.freq= 0;
+ c3.acc= 0;
+ }
+ rot_chariot();
+ rot_chariot();
+ }
+
+
+void trait_ph()
+ {
+ const array<0,2,integer> deca
+ = {{300,30,40}};
+
+ ptr_tcph= pred(integer,num_ph);
+ ledeb=swap(t_cph[ptr_tcph]) + deca[typlec];
+ lefin=swap(t_cph[ptr_tcph+1]) + deca[typlec];
+ nb_word= lefin - ledeb;
+ ptr_tcph=(cardinal)ledeb >> 1;
+ ptr_word = 0;
+ do {
+ memw[adword+ ptr_word]= t_cph[ptr_tcph];
+ ptr_word = ptr_word +2;
+ ptr_tcph = ptr_tcph+1;
+ } while (!(ptr_tcph>=((cardinal)lefin >> 1)));
+
+ ptr_oct= 0;
+ ptr_word= 0;
+ init_chariot();
+
+ do {
+ rot_chariot();
+ charg_car();
+ trait_car();
+ } while (!(ptr_word >= nb_word));
+
+ rot_chariot();
+ trait_car();
+ entroct(ord('#'));
+ }
+
+
+
+ void parole(integer rep, integer ht, integer typ)
+ {
+ array<0,500,integer> savph;
+ integer i;
+ integer tempo;
+
+
+ if (sonoff) return;
+ num_ph= rep;
+ haut= ht;
+ typlec= typ;
+ if (typlec!=0)
+ {
+ for( i=0; i <= 500; i ++) savph[i]=t_cph[i];
+ tempo= tempo_bruit;
+ }
+ else
+ if (haut>5) tempo= tempo_f;
+ else tempo= tempo_m;
+ addfix= (real)((tempo-addv[0]))/256;
+ cctable(tbi);
+ switch (typ) {
+ case 1 : {
+ charge_bruit();
+ /*if zuul then zzuul(adbruit,0,1095);*/
+ regenbruit();
+ }
+ break;
+ case 2 : {
+ charge_son();
+ charge_phbruit();
+ }
+ break;
+ }
+ trait_ph();
+ litph(tbi,typ,tempo);
+ if (typlec!=0)
+ for( i=0; i <= 500; i ++)
+ {
+ t_cph[i]=savph[i];
+ mlec=typlec;
+ }
+ writepal(numpal);
+ }
+
+
+
diff --git a/engines/mortevielle/prog.h b/engines/mortevielle/prog.h
new file mode 100644
index 0000000000..a3ba1896ae
--- /dev/null
+++ b/engines/mortevielle/prog.h
@@ -0,0 +1,346 @@
+/* overlay */ void change_gd(integer ngd)
+{
+ integer i;
+
+ hide_mouse();
+ gd= ngd;
+ hirs();
+ init_mouse();
+ show_mouse();
+ dessine_rouleau();
+ tinke();
+ pendule();
+ if (ipers!=0) affper(ipers); else person();
+ clsf2();
+ clsf3();
+ maff= 68;
+ afdes(0);
+ repon(2,crep);
+ menu_aff();
+}
+
+/* overlay */ void antegame()
+{
+ integer cx;
+ registres regs;
+ array<0,511,char> buffer;
+ integer i,j,k;
+ array<0,2,boolean> test;
+ array<0,7,char> g;
+
+
+ hide_mouse();
+ imen= false;
+ g[1]='M';
+perdu= true;
+ anyone= false;
+okdes= true;
+ test[0]= false;
+ test[1]=false;
+ g[0]='\40';
+ col= false;
+ tesok= true;
+ test[2]=false;
+ g[7]=g[0];
+ g[2]='A';
+ cache= false;
+ brt= false;
+ maff= 68;
+ g[5]='E';
+ mnumo= 0;
+ prebru= 0;
+ g[4]='T';
+ x= 0;
+ y= 0;
+ num= 0;
+ hdb= 0;
+ hfb= 0;
+ cs= 0;
+ is= 0;
+ k= 0;
+ ment= 0;
+syn= true;
+fouil= true;
+ mchai= 0;
+ inei= 0;
+ initouv();
+ g[3]='S';
+ g[6]='R';
+ iouv= 0;
+ dobj= 0;
+ affrep();
+ stpou= ind_mess;
+ while ((test[k]==false) && (k<2))
+ {
+ regs.ax=0;
+ k=succ(integer,k);
+ intr(19,regs);
+ {
+ regs.ax=0x201;regs.cx=0x1;regs.dx=0x100+k-1;regs.es=seg(buffer);regs.bx=ofs(buffer);
+ intr(19,regs);
+ test[k]=! imen;
+ i=0;
+ while ((test[k]) && (i<19))
+ {
+ regs.ax=0x201;
+ syn= false;regs.cx=0x2700+i;regs.dx=0x100+k-1;regs.es=seg(buffer);regs.bx=ofs(buffer);
+ intr(19,regs);if (lo(regs.flags) % 2==1) test[k]=false;i=i+1;
+ }
+ okdes= false;
+ solu= true;
+ for( j=0; j <= 7; j ++) if (buffer[j+504]!=g[j]) test[k]=false;
+ }
+ perdu= false;
+ fouil= false;
+ }
+ person();
+ tinke();
+ pendule();
+ afdes(0);
+ repon(2,crep);
+ clsf3();
+ solu= false;
+ tmlieu(s.mlieu);
+ modinv();
+ if (s.derobj!= 0) modobj2(s.derobj+ 400,test[1],test[2]);
+ else tesok=test[1] || test[2];
+ show_mouse();
+}
+
+
+/* NIVEAU 3 */
+/* procedure PROGRAMME */
+void tmaj3()
+{
+ integer j,h,m;
+
+ calch(j,h,m);
+ if (m== 30) m= 1;
+ h= h+ (j* 24);
+ m= m+ (h* 2);
+ s.heure= chr(m);
+}
+
+void tsitu()
+
+{
+ integer h,j,m;
+
+ if (! col) clsf2();
+ syn= false;
+ iesc= false;
+ if (anyone) goto L1;
+ if (brt)
+ if ((msg[3]== depla) || (msg[4]== sortir) || (msg[4]== dormir) ||
+ (msg[4]== manger))
+ {
+ ctrm= 4;
+ goto L2;
+ }
+ if (msg[3]== depla) taller();
+ if (msg[3]== discut) tparler();
+ if (msg[3]== invent) tsprendre();
+ if (msg[4]== attacher) tattacher();
+ if (msg[4]== attendre) tattendre();
+ if (msg[4]== defoncer) tdefoncer();
+ if (msg[4]== dormir) tdormir();
+ if (msg[4]== ecouter) tecouter();
+ if (msg[4]== entrer) tentrer();
+ if (msg[4]== fermer) tfermer();
+ if (msg[4]== fouiller) tfouiller();
+ if (msg[4]== frapper) tfrapper();
+ if (msg[4]== gratter) tgratter();
+ if (msg[4]== lire) tlire();
+ if (msg[4]== manger) tmanger();
+ if (msg[4]== mettre) tmettre();
+ if (msg[4]== ouvrir) touvrir();
+ if (msg[4]== prendre) tprendre();
+ if (msg[4]== regarder) tregarder();
+ if (msg[4]== sentir) tsentir();
+ if (msg[4]== sonder) tsonder();
+ if (msg[4]== sortir) tsortir();
+ if (msg[4]== soulever) tsoulever();
+ if (msg[4]== tourner) ttourner();
+ if (msg[4]== scacher)
+ {
+ tcacher();
+ goto L1;
+ }
+ if (msg[4]== sfouiller) tsfouiller();
+ if (msg[4]== slire) tslire();
+ if (msg[4]== sposer) tposer();
+ if (msg[4]== sregarder) tsregarder();
+ cache= false;
+L1:
+ if (anyone)
+ {
+ quelquun();
+ anyone= false;
+ goto L2;
+ }
+ calch(j,h,m);
+ if ((((h== 12) || (h== 13) || (h== 19)) && (s.mlieu!= 10)) ||
+ ((h> 0) && (h< 6) && (s.mlieu!= 0))) s.conf= s.conf+ 1;
+ if (((s.mlieu< 16) || (s.mlieu> 19)) && (s.mlieu!= 23)
+ && (s.mlieu!= 0) && (s.derobj!= 152) && (! perdu))
+ {
+ if ((s.conf> 99) && (h> 8) && (h< 16))
+ {
+ crep= 1501;
+ tperd();
+ }
+ if ((s.conf> 99) && (h> 0) && (h< 9))
+ {
+ crep= 1508;
+ tperd();
+ }
+ if ((j> 1) && (h> 8) && (! perdu))
+ {
+ crep= 1502;
+ tperd();
+ }
+ }
+L2:
+ mennor();
+}
+
+void sv_game(integer n);
+
+void ld_game(integer n);
+
+void tecran()
+{
+ const char idem[] = "Idem";
+ const integer lim = 20000;
+ integer temps;
+ char inkey;
+ boolean oo, funct;
+
+ clsf3();
+ oo= false;
+ ctrm= 0;
+ if (! iesc)
+ {
+ draw_menu();
+ imen= true;
+ temps= 0;
+ key= 0;
+ funct= false;
+ inkey='.';
+
+ do {
+ mdn();
+ tinke();
+ mov_mouse(funct,inkey);
+ temps= temps+ 1;
+ } while (!((choisi) || (temps > lim) || (funct) || (anyone)));
+
+ erase_menu();
+ imen= false;
+ if (set::of('\1','\3','\5','\7','\11', eos).has(inkey))
+ {
+ change_gd((cardinal)pred(integer,ord(inkey)) >> 1);
+ return;
+ }
+ if (choisi && (msg[3]==sauve)) sv_game(msg[4] & 7);
+ if (choisi && (msg[3]==charge)) ld_game(pred(integer,msg[4] & 7));
+ if (inkey== '\103') /* F9 */
+ {
+ temps = do_alert(stpou,1);
+ return;
+ }
+ else
+ if (inkey== '\77')
+ {
+ if ((mnumo!= no_choice) && ((msg[3]== action) || (msg[3]== saction)))
+ {
+ msg[4]= mnumo;
+ ecr3(idem);
+ }
+ else return;
+ }
+ else
+ if (inkey== '\104')
+ {
+ if ((x!= 0) && (y!= 0)) num= 9999;
+ return;
+ }
+ }
+ if (inkey== '\73')
+ {
+ arret= true;
+ tmaj3();
+ }
+ else
+ {
+ if ((funct) && (inkey!= '\77')) return;
+ if (temps> lim)
+ {
+ repon(2,141);
+ if (num== 9999) num= 0;
+ }
+ else
+ {
+ mnumo= msg[3];
+ if ((msg[3]== action) || (msg[3]== saction)) mnumo= msg[4];
+ if (! anyone)
+ {
+ if ((fouil) || (obpart))
+ {
+ if (y_s< 12) return;
+ if ((msg[4]== sonder) || (msg[4]== soulever))
+ {
+ oo= true;
+ if ((msg[4]== soulever) || (obpart))
+ {
+ finfouil();
+ caff= s.mlieu;
+ crep= 998;
+ }
+ else tsuiv();
+ mennor();
+ }
+ }
+ }
+ do {
+ if (! oo) tsitu();
+ if ((ctrm== 0) && (! perdu) && (! solu))
+ {
+ taffich();
+ if (okdes)
+ {
+ okdes= false;
+ dessin(0);
+ }
+ if ((! syn) || (col)) repon(2,crep);
+ }
+ } while (!(! syn));
+ if (ctrm!= 0) tctrm();
+ }
+ }
+}
+
+/* NIVEAU 1 */
+
+void theure()
+{
+ vj= ord(s.heure);
+ vh= vj % 48;
+ vj= vj / 48;
+ vm= vh % 2;
+ vh= vh / 2;
+ heu= vh;
+ if (vm== 1) min= 30; else min= 0;
+}
+
+
+void tjouer()
+{
+ antegame();
+ do {
+ tecran();
+ } while (!((arret) || (solu) || (perdu)));
+ if (solu) tmaj1(); else
+ if (perdu) tencore();
+}
+
diff --git a/engines/mortevielle/ques.h b/engines/mortevielle/ques.h
new file mode 100644
index 0000000000..66584d5d3c
--- /dev/null
+++ b/engines/mortevielle/ques.h
@@ -0,0 +1,121 @@
+
+/* overlay */ boolean ques()
+{
+ const array<1,10,integer> ta
+ = {{ 511, 516, 524, 531, 545,
+ 552, 559, 563, 570, 576}};
+ const array<1,10,integer> ok
+ = {{ 4, 7, 1, 6, 4, 4, 2, 5, 3, 1 }};
+
+ boolean q, func, test;
+ integer i,j,k,y,memk;
+ integer tay , tmax;
+ integer rep, prem, der;
+ phrase st;
+ char key;
+ mult_rect coor;
+ array<1,14,str40> chaines;
+ integer compte;
+
+
+ boolean ques_result;
+ test=false;
+ i=0;
+ compte= 0;
+
+ do {
+ hide_mouse();
+ hirs();
+ show_mouse();
+ i= i+1;
+ deline(ta[i],st,tay);
+ if (res==1) y=29; else y=23;
+ box(15,gd,0,14,630,y,255);
+ afftex(st,20,15,100,2,0);
+ if (i!=10)
+ {
+ prem= ta[i]+1;
+ der= ta[i+1]-1;
+ }
+ else
+ {
+ prem= 503;
+ der= 510;
+ }
+ y=35;
+ tmax= 0;
+ memk= 1;
+ for( j= prem; j <= der; j ++)
+ {
+ deline(j,st,tay);
+ if (tay>tmax) tmax= tay;
+ afftex(st,100,y,100,1,0);
+ chaines[memk]= delig;
+ memk= memk+1;
+ y= y+8;
+ }
+ for( j= 1; j <= succ(integer,der-prem); j ++)
+ {
+ {
+ rectangle& with = coor[j];
+
+ with.x1= 45*res;
+ with.x2= (tmax*3 + 55)*res;
+ with.y1= 27 + j*8;
+ with.y2= 34 + j*8;
+ with.etat= true;
+ }
+ while (length(chaines[j] )<tmax)
+ {
+ chaines[j]= chaines[j] +' ';
+ }
+ }
+ coor[j+1].etat= false;
+ if (res==1) rep=10; else rep=6;
+ boite(80, 33, 40+tmax*rep, (der-prem)*8+ 16, 15);
+ rep= 0;
+ j= 0;
+ memk= 0;
+ do {
+ clic= false;
+ tesok=false;
+ mov_mouse(func,key);
+ k= 1;
+ while (coor[k].etat && ! dans_rect(coor[k])) k= k+1;
+ if (coor[k].etat)
+ {
+ if ((memk!=0) && (memk!=k))
+ {
+ /*DeLine(T_rec[ta[i]+memk].indis,T_rec[ta[i]+memk].point,st,tay);*/
+ for( j= 1; j <= tmax; j ++) st[j]= chaines[memk][j];
+ st[1+tmax]= '$';
+ afftex(st,100,27+memk*8,100,1,0);
+ }
+ if (memk!=k)
+ {
+ /*DeLine(T_rec[pred(prem)+k].indis,T_rec[pred(prem)+k].point,st,tay);*/
+ for( j= 1; j <= tmax; j ++) st[j]= chaines[k][j];
+ st[1+tmax]= '$';
+ afftex(st,100,27+k*8,100,1,1);
+ memk= k;
+ }
+ }
+ else
+ if (memk!=0)
+ {
+ for( j= 1; j <= tmax; j ++) st[j]= chaines[memk][j];
+ st[1+tmax]= '$';
+ afftex(st,100,27+memk*8,100,1,0);
+ memk=0;
+ }
+ } while (!((memk!=0) && clic));
+ if (memk==ok[i]) compte=compte+1;
+ else {
+ if (i==5) i=i +1;
+ if ((i==7) || (i==8)) i= 10;
+ }
+ if (i==10) q= /*testprot*/ true;
+ } while (!(i==10));
+ ques_result= (compte==10) && q;
+ return ques_result;
+}
diff --git a/engines/mortevielle/sprint.h b/engines/mortevielle/sprint.h
new file mode 100644
index 0000000000..b54e2ba51c
--- /dev/null
+++ b/engines/mortevielle/sprint.h
@@ -0,0 +1,55 @@
+void fill_box(integer x,integer y,integer dx)
+{
+ box(15,gd,pred(integer,x) << 3, pred(integer,y) << 3, pred(integer,x+dx) << 3, y << 3, 255);
+}
+
+void clear_box(integer x,integer y,integer dx)
+{
+ box(0,gd,pred(integer,x) << 3, pred(integer,y) << 3, pred(integer,x+dx) << 3, y << 3, 255);
+}
+
+void writeg(str255 l,integer c)
+
+{
+ integer i, x, xo, yo;
+ integer cecr;
+ boolean t;
+
+/* debug('writeg : '+l);*/
+
+ if (l=="") return;
+ hide_mouse();
+ xo=xwhere;
+ yo=ywhere;
+ if (res==2) i=6;
+ else i=10;
+ x=xo+i*length(l);
+ switch (c) {
+ case 1:case 3 : {
+ cecr=0;
+ box(15,gd,xo,yo,x,yo+7,255);
+ }
+ break;
+ case 4 : {
+ cecr=0;
+ }
+ break;
+ case 5 : {
+ cecr=15;
+ }
+ break;
+ case 0:case 2 : {
+ cecr=15;
+ box(0,gd,xo,yo,x,yo+7,255);
+ }
+ break;
+ }
+ xo=xo+1;
+ yo=yo+1;
+ for( x=1; x <= length(l); x ++)
+ {
+ affcar(gd,xo,yo,cecr,ord(l[x]));
+ xo=xo+i;
+ }
+ show_mouse();
+}
diff --git a/engines/mortevielle/taffich.h b/engines/mortevielle/taffich.h
new file mode 100644
index 0000000000..8f8cb1e460
--- /dev/null
+++ b/engines/mortevielle/taffich.h
@@ -0,0 +1,216 @@
+void chardes( str11 nom, long_integer passe, integer long_)
+ {
+ integer i, p, l;
+ byte b;
+ untyped_file f;
+
+ /* debug('chardes'); */
+ assign(f,nom);
+ /*$i-*/
+ reset(f);
+ testfi();
+ p= 0;
+ while (passe>127)
+ {
+ p=p+1;
+ passe=passe-128;
+ }
+ if (p!=0) seek(f,p);
+ p= trunc(passe);
+ l= long_+p;
+ i= 0;
+ while (l>0)
+ {
+ blockread(f,mem[0x6000+i],1);
+ testfi();
+ l= l-128;
+ i= i+128;
+ }
+ close(f);
+ for( i=p; i <= long_+p; i ++) mem[0x7000+i-p]=mem[0x6000+i];
+ /*$i+*/
+ }
+
+void charani( str11 nom, long_integer passe, integer long_)
+ {
+ integer i, p, l;
+ byte b;
+ untyped_file f;
+
+ /* debug('charani'); */
+ assign(f,nom);
+ /*$i-*/
+ reset(f);
+ testfi();
+ p= 0;
+ while (passe>127)
+ {
+ passe=passe-128;
+ p=p+1;
+ }
+ if (p!=0) seek(f,p);
+ p= trunc(passe);
+ l=long_+p;
+ i= 0;
+ while (l>0)
+ {
+ blockread(f,mem[0x6000+i],1);
+ testfi();
+ l=l-128;
+ i=i+128;
+ }
+ close(f);
+ for( i=p; i <= long_+p; i ++) mem[0x7314+i-p]=mem[0x6000+i];
+ /*$i+*/
+ }
+
+void taffich()
+{
+ const array<136,140,byte> tran1
+ = {{ 121, 121, 138, 139, 120 }};
+ const array<153,161,byte> tran2
+ = {{ 150, 150, 152, 152, 100,
+ 110, 159, 100, 100 }};
+ integer i, m, a, b, cx, handle,
+ npal;
+ long_integer lgt, lhandle;
+ str11 nom;
+ integer palh,k,j;
+ array<0,15,integer> alllum;
+
+
+ a= caff;
+ if (set::of(range(153,161), eos).has(a)) a= tran2[a];
+ else if (set::of(range(136,140), eos).has(a)) a= tran1[a];
+ b= a;
+ if (maff== a) return;
+ if (a== 16)
+ {
+ s.pourc[9]= '*';
+ s.teauto[42]= '*';
+ }
+ if (a== 20)
+ {
+ s.teauto[39]= '*';
+ if (s.teauto[36]== '*')
+ {
+ s.pourc[3]= '*';
+ s.teauto[38]= '*';
+ }
+ }
+ if (a== 24) s.teauto[37]= '*';
+ if (a== 30) s.teauto[9]= '*';
+ if (a== 31)
+ {
+ s.pourc[4]= '*';
+ s.teauto[35]= '*';
+ }
+ if (a== 118) s.teauto[41]= '*';
+ if (a== 143) s.pourc[1]= '*';
+ if (a== 150) s.teauto[34]= '*';
+ if (a== 151) s.pourc[2]= '*';
+ okdes= true;
+ hide_mouse();
+ lgt= 0;
+ if ((a!=50) && (a!=51))
+ {
+ m= a+ 2000;
+ if ((m> 2001) && (m< 2010)) m= 2001;
+ if (m== 2011) m= 2010;
+ if (a== 32) m= 2034;
+ if ((a== 17) && (maff== 14)) m= 2018;
+ if (a> 99)
+ if ((is== 1) || (is== 0)) m= 2031; else m= 2032;
+ if (((a> 69) && (a< 80)) || (a== 30) || (a== 31) || (a== 144)
+ || (a== 147) || (a== 149)) m= 2030;
+ if (((a< 27) && (((maff> 69) && (! s.ipre)) || (maff> 99)))
+ || ((maff> 29) && (maff< 33))) m= 2033;
+ messint(m);
+ maff= a;
+ if (a== 159) a= 86; else
+ if (a> 140) a= a- 67; else
+ if (a> 137) a= a- 66; else
+ if (a> 99) a= a- 64; else
+ if (a> 69) a= a- 42; else
+ if (a> 29) a= a- 5; else
+ if (a== 26) a= 24; else
+ if (a> 18) a= a- 1;
+ npal= a;
+ for( cx= 0; cx <= (a- 1); cx ++) lgt= lgt+l[cx];
+ handle=l[a];
+ nom= "DXX.mor";
+ }
+ else
+ {
+ nom= "DZZ.mor";
+ handle= l[87];
+ if (a== 51)
+ {
+ lgt= handle;
+ handle= l[88];
+ }
+ maff= a;
+ npal= a+37;
+ }
+ chardes(nom,lgt,handle);
+ if (gd==her)
+ {
+ for( i=0; i <= 15; i ++)
+ {
+ palh=memw[0x7000+(succ(integer,i) << 1)];
+ alllum[i]=(palh & 15) + (((cardinal)palh >> 12) & 15) + (((cardinal)palh >> 8) & 15);
+ }
+ for( i=0; i <= 15; i ++)
+ {
+ k=0;
+ for( j=0; j <= 15; j ++) if (alllum[j]>alllum[k]) k=j;
+ mem[0x7000+2+(k << 1)]= rang[i];
+ alllum[k]=-1;
+ }
+ }
+ numpal=npal;
+ writepal(npal);
+
+ if ((b< 15) || (b== 16) || (b== 17) || (b== 24) || (b== 26) || (b== 50))
+ {
+ lgt= 0;
+ if ((b< 15) || (b== 16) || (b== 17) || (b== 24) || (b== 26))
+ {
+ if (b== 26) b= 18; else
+ if (b== 24) b= 17; else
+ if (b> 15) b= b- 1;
+ for( cx= 0; cx <= (b- 1); cx ++) lgt= lgt+ l[cx+89];
+ handle=l[b+89];
+ nom= "AXX.mor";
+ }
+ else
+ if (b== 50)
+ {
+ nom= "AZZ.mor";
+ handle= 1260;
+ }
+ charani(nom,lgt,handle);
+ }
+ show_mouse();
+ if ((a< 27) && ((maff< 27) || (s.mlieu== 15)) && (msg[4]!= entrer))
+ {
+ if ((a== 13) || (a== 14)) person();
+ else if (! blo) t11(s.mlieu, cx);
+ mpers= 0;
+ }
+}
+
+/* begin
+ for i:=0 to 15 do
+ begin
+ PalH:=memw[$7000:succ(i) shl 1];
+ Alllum[i]:=PalH and 15 + PalH shr 4 and 15 + PalH shr 8 and 15;
+ end;
+ for i:=0 to 15 do
+ begin
+ k:=0;
+ for j:=0 to 15 do if Alllum[j]>Alllum[k] then k:=j;
+ mem[$7000:2+k shl 1]:= Rang[i];
+ Alllum[k]:=-1;
+ end;
+ end;*/
diff --git a/engines/mortevielle/var_mor.h b/engines/mortevielle/var_mor.h
new file mode 100644
index 0000000000..c1881be6fe
--- /dev/null
+++ b/engines/mortevielle/var_mor.h
@@ -0,0 +1,485 @@
+
+/* Constantes, Types et Variables pour le
+
+ M A N O I R DE M O R T E V I E L L E
+
+ ( version Nov 1988
+ +
+ musique & paroles Oct 88 )
+ */
+
+
+/*---------------------------------------------------------------------------*/
+/*------------------------- CONSTANTES ----------------------------------*/
+/*---------------------------------------------------------------------------*/
+
+const real freq0 = 1.19318e6;
+
+const integer seg_syst = 0x6fed;
+const integer segmou = 0x6f00;
+const integer segdon = 0x6c00;
+const integer adani = 0x7314;
+const integer adword = 0x4000;
+const integer adtroct = 0x406b;
+const integer adcfiec = 0x4300;
+const integer adbruit = 0x5cb0;/*2C00;*/
+const integer adbruit1 = 0x6924;/*3874;*/
+const integer adbruit2 = 0x6b30;/*3A80;*/
+const integer adbruit3 = 0x6ba6;/*3AF6;*/
+const integer adbruit5 = 0x3b50;
+const integer adson = 0x5cb0;/*2C00;*/
+const integer adson2 = 0x60b0;/*3000;*/
+const integer offsetb1 = 6;
+const integer offsetb2 = 4;
+const integer offsetb3 = 6;
+
+const integer null = 255;
+
+const integer tempo_mus = 71;
+const integer tempo_bruit = 78;
+const integer tempo_f = 80;
+const integer tempo_m = 89;
+
+const integer ti1 = 410;
+const integer ti2 = 250;
+const integer maxti = 7975;
+const integer maxtd = 600;
+const integer max_rect = 14;
+
+const integer ams = 0;
+const integer cga = 1;
+const integer ega = 2;
+const integer her = 3;
+const integer tan = 4;
+
+const integer c_repon = 0;
+const integer c_st41 = 186;
+const integer c_tparler = 247;
+const integer c_paroles = 292;
+const integer c_tmlieu = 435;
+const integer c_dialpre = 456;
+const integer c_action = 476;
+const integer c_saction = 497;
+const integer c_dis = 502;
+const integer c_fin = 510; /* => n'existe pas ; si !! */
+
+const integer arega = 0;
+const integer asoul = 154;
+const integer aouvr = 282;
+const integer achai = 387;
+const integer acha = 492;
+const integer arcf = 1272;
+const integer arep = 1314;
+const integer amzon = 1650;
+const integer fleche = 1758;
+
+const integer no_choice = 0;
+const integer invent = 1;
+const integer depla = 2;
+const integer action = 3;
+const integer saction = 4;
+const integer discut = 5;
+const integer fichier = 6;
+const integer sauve = 7;
+const integer charge = 8;
+
+const integer attacher = 0x301;
+const integer attendre = 0x302;
+const integer defoncer = 0x303;
+const integer dormir = 0x304;
+const integer ecouter = 0x305;
+const integer entrer = 0x306;
+const integer fermer = 0x307;
+const integer fouiller = 0x308;
+const integer frapper = 0x309;
+const integer gratter = 0x30a;
+const integer lire = 0x30b;
+const integer manger = 0x30c;
+const integer mettre = 0x30d;
+const integer ouvrir = 0x30e;
+const integer prendre = 0x30f;
+const integer regarder = 0x310;
+const integer sentir = 0x311;
+const integer sonder = 0x312;
+const integer sortir = 0x313;
+const integer soulever = 0x314;
+const integer tourner = 0x315;
+
+const integer scacher = 0x401;
+const integer sfouiller = 0x402;
+const integer slire = 0x403;
+const integer sposer = 0x404;
+const integer sregarder = 0x405;
+
+ const array<0,17,byte> tabdbc
+ = {{7, 23, 7, 14, 13, 9, 14, 9, 5, 12, 6, 12, 13, 4, 0, 4, 5, 9}};
+ const array<0,15,byte> tabdph
+ = {{0, 10, 2, 0, 2, 10, 3, 0, 3, 7, 5, 0, 6, 7, 7, 10}};
+ const array<0,25,byte> typcon
+ = {{0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3}};
+ const array<0,25,byte> intcon
+ = {{1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}};
+ const array<0,363,byte> tnocon
+ = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0}};
+
+
+const matrix<1,8,1,4,byte> don
+ = {{{{ 7, 37, 22, 8}},
+ {{19, 33, 23, 7}},
+ {{31, 89, 10, 21}},
+ {{43, 25, 11, 5}},
+ {{55, 37, 5, 8}},
+ {{64, 13, 11, 2}},
+ {{62, 22, 13, 4}},
+ {{62, 25, 13, 5}}}};
+
+const array<1,2,varying_string<11> > fic
+ = {{ " Sauvegarde",
+ " Chargement" }};
+
+const array<0,1,byte> addv
+ = {{8,8}};
+
+const char recom[] = " Recommence ";
+
+ const char f3[] = "F3: Encore";
+ const char f8[] = "F8: Suite";
+
+ const integer max_patt = 20;
+
+
+ const array<0,15,byte> rang
+ = {{15,14,11,7,13,12,10,6,9,5,3,1,2,4,8,0}};
+
+
+/*---------------------------------------------------------------------------*/
+/*-------------------------------- TYPES --------------------------------*/
+/*---------------------------------------------------------------------------*/
+
+typedef varying_string<11> path_chars;
+typedef real long_integer;
+typedef varying_string<255> str255;
+typedef varying_string<125> str125;
+typedef varying_string<30> str30;
+typedef varying_string<11> str11;
+typedef file<byte> fichier_byte;
+struct sav_chaine {
+ integer conf;
+ array<0,10,char> pourc;
+ array<0,42,char> teauto;
+ array<0,30,char> sjer;
+ integer mlieu,iboul,ibag,icave,ivier,ipuit;
+ integer derobj,iloic,icryp;
+ boolean ipre;
+ char heure;
+};
+struct registres {
+ integer ax,bx,cx,dx,bp,si,di,ds,es,flags;
+};
+typedef array<1,1410,char> phrase;
+typedef array<0,maxti,integer> tabint;
+ struct ind {
+ integer indis;
+ byte point;
+ };
+typedef array<0,maxtd,ind> tabind;
+
+typedef matrix<1,7,0,24,byte> tab_mlieu;
+
+ typedef array<0,255,real> table;
+typedef array<0,255,integer> tablint;
+
+ typedef integer word1;
+struct chariot {
+ integer val,
+ code,
+ acc,
+ freq,
+ rep;
+};
+
+struct doublet {
+ byte x,y;
+};
+typedef array<1,16,doublet> tabdb;
+typedef array<0,107,integer> tfxx;
+struct rectangle {
+ integer x1, x2, y1, y2;
+ boolean etat;
+};
+
+typedef array<1,max_rect,rectangle> mult_rect;
+typedef varying_string<40> str40;
+
+ struct pattern {
+ byte tay, tax;
+ matrix<1,max_patt, 1,max_patt,byte> des;
+ };
+
+
+ struct nhom {
+ byte n; /* numero entre 0 et 32 */
+ array<0,3,byte> hom;
+ };
+
+ typedef array<0,15,nhom> t_nhom;
+
+ struct t_pcga {
+ byte p;
+ t_nhom a;
+ };
+
+ typedef array<0,90,t_pcga> pal_cga;
+
+
+/*---------------------------------------------------------------------------*/
+/*------------------------------ VARIABLES ------------------------------*/
+/*---------------------------------------------------------------------------*/
+
+boolean blo,
+bh1,
+bf1,
+bh2,
+bh4,
+bf4,
+bh5,
+bh6,
+bh8,
+bt3,
+bt7,
+bh9,
+
+sonoff,
+main1,
+choisi,
+test0,
+f2_all,
+imen,
+cache,
+iesc,
+perdu,
+col,
+syn,
+fouil,
+zuul,
+tesok,
+obpart,
+okdes,
+solu,
+arret,
+anyone,
+brt,
+rect,
+rech_cfiec,
+active_menu;
+
+
+integer x,
+y,
+t,
+vj,
+li,
+vh,
+vm,
+jh,
+mh,
+cs,
+gd, /* Gd = graph device */
+hdb,
+hfb,
+heu,
+jou,
+key,
+min,
+num,
+max,
+res,
+ment,
+haut,
+caff,
+maff,
+crep,
+ades,
+iouv,
+inei,
+ctrm,
+dobj,
+msg3,
+msg4,
+mlec,
+newgd,
+c_zzz,
+mchai,
+menup,
+ipers,
+ledeb,
+lefin,
+mpers,
+mnumo,
+xprec,
+yprec,
+perdep,
+prebru,
+typlec,
+num_ph,
+xwhere,
+ywhere,
+numpal,
+lderobj,
+nb_word,
+ptr_oct,
+k_tempo,
+ptr_tcph,
+ptr_word,
+color_txt;
+
+array<0,6400,integer> t_cph;
+array<0,4000,byte> tabdon;
+/* t_dxx : array[0..121] of integer;*/
+str125 stpou; /* donne le % d'indices */
+byte is;
+char mode;
+fichier_byte ficdes;
+str125 al_mess,
+err_mess,
+ind_mess,
+al_mess2;
+
+ array<1,8,integer> invt,
+nbrep,
+nbrepm,
+ disc;
+ array<0,4,integer> msg;
+ array<1,7,integer> depl;
+ array<1,8,varying_string<22> > inv;
+ array<1,7,varying_string<23> > dep;
+ array<1,21,varying_string<10> > act;
+ array<1,5,varying_string<11> > self_;
+ array<1,8,varying_string<5> > dis;
+ array<1,7,char> touv;
+ sav_chaine s,s1;
+array<0,390,byte> bufcha;
+
+matrix<1,6,0,23,byte> lettres;
+
+array<0,15,byte> palher;
+
+ tabint t_mot;
+integer tay_tchar;
+ tabind t_rec;
+ file<ind> sauv_t;
+ untyped_file fibyte;
+ tab_mlieu v_lieu;
+ tfxx l;
+ tablint tbi;
+chariot c1, c2, c3;
+ real addfix;
+ pal_cga palsav;
+ array<0,90,tabdb> tabpal;
+ pal_cga palcga;
+ array<0,14,pattern> tpt;
+
+
+
+/*---------------------------------------------------------------------------*/
+/*-------------------- PROCEDURES ET FONCTIONS ------------------------*/
+/*---------------------------------------------------------------------------*/
+
+/* procedure box(c,Gd,xo,yo,xi,yi,patt:integer); external 'c:\mc\boite.com'; */
+
+void hirs()
+{
+ const array<0,13,byte> tandy
+ = {{113,80,90,14,63,6,50,56,2,3,6,7,0,0}};
+ const array<0,12,byte> herc
+ = {{50,40,41,9,103,3,100,100,2,3,0,0,0}};
+ integer i, j;
+
+ switch (gd) {
+ case cga :
+ {
+ graphcolormode;
+ graphbackground(0);
+ palette(1);
+ res=1;
+ }
+ break;
+ case ams :
+ {
+ hires;
+ inline_((real)(0xb8)/6/0/ /* => mov ax,6 */
+ 0xcd/0x10); /* => int 16 */
+ port[0x3d9]=15;
+ port[0x3df]=0;
+ port[0x3dd]=15;
+ res=2;
+ }
+ break;
+ case ega :
+ {
+ inline_((real)(0xb8) / 14 / 0 / /* MOV AX, 14 ; mode video 14 = 640*200 16 couleurs */
+ 0xcd / 0x10); /* INT 16 */
+ res=2;
+ }
+ break;
+ case her :
+ {
+ port[0x3bf]=3;
+ port[0x3b8]=2;
+ for( i=0; i <= 12; i ++)
+ {
+ port[0x3b4]=i;
+ port[0x3b5]=herc[i];
+ }
+ inline_((real)(0xfc)/0xb9/0/0x80/0xb8/0/0xb0/0x8e/0xc0/0x31/0xff/0x31/0xc0/0xf3/0xab);
+ port[0x3b8]=10;
+ res=2;
+ }
+ break;
+ case tan :
+ {
+ port[0x3d8]=0;
+ port[0x3da]=3;
+ port[0x3de]=0x14;
+ for( i=0; i <= 13; i ++)
+ {
+ port[0x3d4]=i;
+ port[0x3d5]=tandy[i];
+ }
+ port[0x3da]=2;
+ port[0x3de]=0;
+ port[0x3d8]=port[0x3d8] | (11 & 0xef);
+ port[0x3dd]=port[0x3dd] | 1;
+ port[0x3df]=port[0x3df] | 0xc0;
+ box(0,gd,0,0,640,200,255);
+ res=1;
+ }
+ break;
+ }
+}
+
+/* procedure affput(Chx,Gd,x,y,coul,char:integer); external 'c:\mc\divaf.com'; */
+
+void affcar(integer gd,integer x,integer y,integer coul,integer char)
+{
+ if (res==1) affput(1,gd,((cardinal)x >> 1),y,coul,char);
+ else affput(1,gd,x,y,coul,char);
+}
+
+void putpix(integer gd,integer x,integer y,integer coul)
+{
+ affput(0,gd,x,y,coul,0);
+}