!============================================================
!   Fonctionnement de l'ordinateur

!==============================
!     L'objet

Object ordinateur "ordinateur en libre service" restau
	with retouche 0,
	name 'ordinateur' 'ordi' 'pc' 'ecran' 'libre' 'service' 'libre-service' 'imprimante' 'logiciel' 'bureau' 'navigateur' 'logiciels' 'fichiers',
	before [;
		Examine: if (self hasnt on) {"Il y a un ordinateur en libre service, avec une imprimante et l'accès à Internet. Pour quelques quarters, vous pourriez utiliser l'ordinateur pour acheter votre billet d'avion... Ah, mais encore une fois, c'est toujours le même problème : avec quelle carte de crédit ?! Ou alors, il reste toujours la solution d'envoyer un mail à votre femme et tout lui avouer... en espérant qu'elle ne vous réponde pas @<< Ça t'apprendra ! @>> et vous laisse moisir sur cette île !";}
			else {
				if (player in chaise) {move player to restau; print "L'ordinateur est à l'autre bout de la plaza ; vous vous levez et vous la traversez, vous dirigeant vers l'ordinateur.^^";}
				print "Votre session est toujours ouverte, et il vous reste environ "; if (self.retouche==0) {print "20";} else {print "4";} print " minutes avant qu'elle ne se ferme. Sur l'ordinateur, vous avez accès à une imprimante, à Internet et à un logiciel de retouches d'images.";
				if (children(self) ~= 0) {print " Sur le bureau de l'ordinateur, vous voyez les fichiers suivants :"; if (boardinghickens in ordinateur) {print " boardinghickens.pdf";} if (boardingfanton in ordinateur) {print " boardingfanton.pdf";} if (boardingmodified in ordinateur) {print " boardingmodifie.pdf";} print ".";
				}
			"";
			}

		SwitchOn: <<OrdiOn>>;
		SwitchOff: if (self has on) {"Il vous reste quelques minutes sur votre session : ce serait dommage de les gaspiller, sans compter que vous n'avez plus aucun quarter !";} else {"L'ordinateur est déjà éteint.";}
		! Note : Receive sans que ça soit un container, c'est un peu sale non ?
		Receive: if (noun==pieces) {<<OrdiOn>>;} else {rfalse;}
		],
has scenery concealed transparent switchable;


!==============================
!     Menu de sélection

[ venezuela ;
	"Ah, le Venezuela... Ses plages de sable fin... Vous vous reprenez : pas le moment de rêvasser, il vous faut rentrer chez vous au plus vite.";
];

Menu ordimenu "Service de réservation en ligne"
	with topline "Sélectionnez une option :";
Object -> "Réserver un vol en ligne"
	with description [; if (bought==0) {ShowMenu(acheterMenu); return 2;} else {"Vous vous sentez déjà coupable d'avoir acheté un billet avec une carte qui n'est pas la vôtre ; vous n'allez pas en acheter d'autres.";}];
Object -> "Modifier ou annuler une réservation existante"
	with description [; print "Oups, mauvaise commande. Vous fermez la fenêtre du navigateur."; w8(); return 3;];
Object -> "Retour"
	with description [; return 3;];

Menu acheterMenu "Réserver un billet (départs aujourd'hui, Jan 23 2012)"
	with topline "Sélectionnez votre vol :";

Object -> "Delta Airlines (DL 722) pour New York JFK à 2:54 pm"
	with description [; "Si vous passez par New York, il vous faudra prendre une correspondance, et ça vous ferait arriver trop tard chez vous ! Non non, un vol direct est requis ici.";];
Object -> "Venezolana (VNE301) pour Maracaibo à 3:00 pm"
	with description [; venezuela();];
Object -> "Aserca Airlines (R7 403) pour Caracas à 3:00 pm"
	with description [; venezuela();];
Object -> "Delta Airlines (DL 654) pour Atlanta à 3:10 pm"
	with description [; print "Vous sélectionnez le vol...^^Ah quand même, $650.^^Vous excusant mentalement à la personne à qui vous avez volé le numéro de carte bancaire @{2014} c'est un cas de force majeure ! ma femme va me tuer ! @{2014}, vous validez.^^Supplément bagages de $25. Vous jurez intérieurement devant la pingrerie croissante des compagnies aériennes, avant de réaliser une seconde plus tard @{2014} et cette pensée n'arrête pas de vous glacer d'effroi @{2014} que vous n'avez rien à enregistrer. Avec un soupir, vous continuez."; w8(); print"^Non, je ne veux pas compenser en carbone mon vol."; w8(); print" ^Non, je ne veux pas voyager en 1ère classe pour $400 de plus."; w8(); print "^Non, je n'ai pas de carte de fidélité."; w8(); print "^^Enfin, vous arrivez à l'écran de paiement pour votre vol."; selection(); return 3;];
Object -> "Tiara Air Aruba (3P 1243) pour Maracaibo à 3:30 pm"
	with description [; venezuela();];
Object -> "United Airlines (UA 596) pour Washington à 4:20 pm"
	with description [; "Si vous passez par Washington, il vous faudra prendre une correspondance, et ça vous ferait arriver trop tard chez vous ! Non non, un vol direct est requis ici.";];
Object -> "American Airlines (AA 2284) pour Miami à 4:25 pm"
	with description [; "Si vous passez par Miami, il vous faudra prendre une correspondance, et ça vous ferait arriver trop tard chez vous ! Non non, un vol direct est requis ici.";];
Object -> "Tiara Air Aruba (3P 207) pour Las Piedras à 4:30 pm"
	with description [; venezuela();];
Object -> "Air Canada (AC 1295) pour Toronto à 5:20 pm"
	with description [; "Si vous passez par Toronto, il vous faudra prendre une correspondance, et ça vous ferait arriver trop tard chez vous ! Non non, un vol direct est requis ici.";];
Object -> "US Airways (US 877) pour Charlotte à 5:40 pm"
	with description [; "Si vous passez par Charlotte, il vous faudra prendre une correspondance, et ça vous ferait arriver trop tard chez vous ! Non non, un vol direct est requis ici.";];


!==============================
!        Acheter le billet

array typecarte string 25;
array prenomcarte string 25;
array numcarte string 25;
array nomcarte string 25;
array datecarte string 25;
array codecarte string 25;
array mock1 string 25;
array mock1b string 25;
array mock2 string 25;
array mock3 string 25;
array mock3b string 25;
array mock3c string 25;
array mock4 string 25;
array mock5 string 25;
array mock6 string 25;

[ selection ;

	print "^^#############################################";
	print "^PAIEMENT POUR VOTRE VOL :";
	print "^^Quel est le type de votre carte ? (MasterCard, Visa, AmEx, Cirrus?)^>";
	read typecarte 0;
	! La majuscule
	if (typecarte->2 < 123 && typecarte->2 >96) {typecarte->2=typecarte->2 - 32;}
	if (typecarte->8 < 123 && typecarte->8 >96) {typecarte->8=typecarte->8 - 32;}	! Mastercard
	if (typecarte->8 == 32 && typecarte->9 <123 && typecarte->9 >96) {typecarte->9=typecarte->9 - 32;}	! Master card
	print "^Quel est votre prénom ?^>";
	read prenomcarte 0; if (prenomcarte->2 < 123 && prenomcarte->2 >96) {prenomcarte->2=prenomcarte->2 - 32;}
	print "^Quel est votre nom ?^>";
	read nomcarte 0; if (nomcarte->2 < 123 && nomcarte->2 >96) {nomcarte->2=nomcarte->2 - 32;}	! pour la majuscule !
	print "^Quel est votre numéro de carte ? (xxxx-xxxx-xxxx-xxxx)^> ";
	read numcarte 0;
	print "^Quel est la date d'expiration de votre carte ? (mois-année)^> ";
	read datecarte 0;
	print "^Quel est le numéro de sécurité ? (trois chiffres derrière la carte)^> ";
	read codecarte 0;

	("MasterCard").print_to_array(mock1);
	("Master Card").print_to_array(mock1b);
	("Ben").print_to_array(mock2);
	("Fanton").print_to_array(mock6);
	! A la main, parce que j'ai la flemme / je suis pas assez bon avec les arrays en I6
	! En I7 on pourrait utiliser des regexp il paraît
	("7742-5226-9520-0000").print_to_array(mock3);
	("7742 5226 9520 0000").print_to_array(mock3b);
	("7742522695200000").print_to_array(mock3c);
	("11-14").print_to_array(mock4);
	("808").print_to_array(mock5);

	if ( (CompareStrings(typecarte,mock1) || CompareStrings(typecarte,mock1b)) && CompareStrings(prenomcarte,mock2) && CompareStrings(nomcarte,mock6) && (CompareStrings(numcarte,mock3) || CompareStrings(numcarte,mock3b) || CompareStrings(numcarte,mock3c) ) && CompareStrings(datecarte,mock4) && CompareStrings(codecarte,mock5)) {bought++; move boardingfanton to ordinateur; print "^Après quelques secondes de chargement, la page s'affiche : la réservation a fonctionné. Vous poussez un soupir de soulagement, et téléchargez l'image de la carte d'embarquement fournie par Delta Airlines. Elle indique bien le nom de Ben Fanton : vous voilà couvert, personne ne retrouvera votre trace.^^Maintenant, il ne reste @<< plus @>> qu'à trouver un moyen de passer le point de sécurité..."; w8(); rtrue;}

	("Visa").print_to_array(mock1);
	("Chester").print_to_array(mock2);
	("Hickens").print_to_array(mock6);
	! A la main, parce que j'ai la flemme / je suis pas assez bon avec les arrays en I6
	! En I7 on pourrait utiliser des regexp il paraît
	("8842-2562-2001-1595").print_to_array(mock3);
	("8842 2562 2001 1595").print_to_array(mock3b);
	("8842256220011595").print_to_array(mock3c);
	("12-12").print_to_array(mock4);
	("230").print_to_array(mock5);

!if ( CompareStrings(typecarte,mock1) && CompareStrings(prenomcarte,mock2) && CompareStrings(nomcarte,mock6) && CompareStrings(numcarte,mock3) && CompareStrings(datecarte,mock4) && CompareStrings(codecarte,mock5))

	if ( CompareStrings(typecarte,mock1) && CompareStrings(prenomcarte,mock2) && CompareStrings(nomcarte,mock6) && (CompareStrings(numcarte,mock3) || CompareStrings(numcarte,mock3b) || CompareStrings(numcarte,mock3c) ) && CompareStrings(datecarte,mock4) && CompareStrings(codecarte,mock5)) {bought++; move boardinghickens to ordinateur; print "^Après quelques secondes de chargement, la page s'affiche : la réservation a fonctionné. Vous poussez un soupir de soulagement, et téléchargez l'image de la carte d'embarquement fournie par Delta Airlines. Elle indique bien le nom de Chester Hickens : vous voilà couvert, personne ne retrouvera votre trace.^^Maintenant, il ne reste @<< plus @>> qu'à trouver un moyen de passer le point de sécurité..."; w8(); rtrue;}

	print "^^#############################################^
	   # ERREUR : informations bancaires erronées #^
	   #############################################^^^
	   Vous jurez dans votre barbe ; il vous faut tout recommencer."; w8(); rtrue;

];


!==============================
!     Les cartes d'embarquement

Object boardingfanton "carte d'embarquement pour Ben Fanton"
	with description "Cette carte d'embarquement est au nom de Ben Fanton... Alias le cocaïnomane que vous avez rencontré dans les toilettes. Mais cette carte d'embarquement ne vous permettra pas de passer la sécurité : les agents de sécurité ne vous laisseront jamais passer si votre carte d'embarquement n'est pas au même nom que votre passeport ! Il vous faudrait un passeport au nom de Ben Fanton... ou alors il faudrait que cette carte d'embarquement soit à votre nom...",
	parse_name [ n t;
		t = NextWord();
		if (action_to_be == ##Retouche or ##Modifier) {n++;}
		while(t) {
			if (t == 'carte' or 'embarquement' or 'boarding' or 'pass' or 'ticket' or 'ben' or 'fanton' or 'billet' or 'billets') {n++;}
			if (t == 'd^' or 'de') {n++;}	! Y'a-t-il mieux ?
			if (self in ordinateur && t == 'pdf' or 'image' or 'fichier' or 'numerique') {n++;}
			t = NextWord();
			}
		return n;
		],
	before [; Imprim: if (self in ordinateur) {imprimerCarte(); rtrue;} else {"Vous avez déjà imprimé cette carte d'embarquement.";}
		Take: switch(parent(self)) {
			casier: if (player in security1 && agente.passed==1) {"Comme l'agente vous l'a dit, vous devez mettre tout ce que vous avez sur le tapis roulant. Il va donc falloir vous en séparer pour un petit moment.";}
			ordinateur: imprimerCarte(); rtrue;
			default: rfalse;
			}
		Retouche, Modifier: if (self in ordinateur) {
					if (ordinateur.retouche == 0) {
						ordinateur.retouche=1; move boardingmodified to ordinateur; "C'est simple : vous allez retoucher numériquement la carte d'embarquement et remplacer le nom de Fanton par le vôtre. Puis, en montrant la fausse carte d'embarquement et votre passeport, la sécurité n'y verra que du feu !^^Vous vous armez de patience et minutie et commencez à patiemment retoucher la carte d'embarquement. Copier une lettre, la coller par-dessus une autre, utiliser le pinceau pour atténuer les différences de couleur... Au bout d'un quart d'heure, vous parvenez à obtenir une image qui ressemble à s'y méprendre à une véritable carte d'embarquement @{2014} à part qu'il y a votre nom dessus désormais ! Satisfait, vous sauvegardez le fichier sur l'ordinateur.";
						}
					else {"Franchement, vous êtes assez fier de ce que vous en avez fait ; il n'y a pas besoin de plus de retouches.";}
					}
				    else {"Cette carte est bien réelle, et ils n'ont pas encore créé de logiciels de retouche de la réalité...";}
		Drop: if (player in security1) {move self to casier; "Vous posez la carte d'embarquement valide dans le casier @{2014} à l'envers, pour ne pas éveiller les soupçons, et en priant pour qu'aucun des agents ne remarque que ce petit bout de papier ressemble à une carte d'embarquement et décide de l'examiner de plus près...";}
		Taste, Touch, Smell: if (self in ordinateur) {"Impossible ; ça n'est qu'un fichier sur un ordinateur.";}
		],
has female ;

Object boardinghickens "carte d'embarquement pour Chester Hickens"
	with description "Cette carte d'embarquement est au nom de Chester Hickens... Alias le fan des Redskins qui attendait d'un air impatient au restaurant de l'aéroport. Mais cette carte d'embarquement ne vous permettra pas de passer la sécurité : les agents de sécurité ne vous laisseront jamais passer si votre carte d'embarquement n'est pas au même nom que votre passeport ! Il vous faudrait un passeport au nom de Chester Hickens... ou alors il faudrait que cette carte d'embarquement soit à votre nom...",
	parse_name [n t;
		t = NextWord();
		if (action_to_be == ##Retouche or ##Modifier) {n++;}
		while(t) {
			if (t == 'carte' or 'embarquement' or 'boarding' or 'pass' or 'ticket' or 'chester' or 'hickens' or 'billet' or 'billets') {n++;}
			if (t == 'd^' or 'de') {n++;}	! Y'a-t-il mieux ?
			if (self in ordinateur && t == 'pdf' or 'image' or 'fichier' or 'numerique') {n++;}
			t = NextWord();
			}
		return n;
		],
	before [; Imprim: if (self in ordinateur) {imprimerCarte(); rtrue;} else {"Vous avez déjà imprimé cette carte d'embarquement.";}
		Take: switch(parent(self)) {
			casier: if (player in security1 && agente.passed==1) {"Comme l'agente vous l'a dit, vous devez mettre tout ce que vous avez sur le tapis roulant. Il va donc falloir vous en séparer pour un petit moment.";}
			ordinateur: imprimerCarte(); rtrue;
			default: rfalse;
			}
		Retouche, Modifier: if (self in ordinateur) {
					if (ordinateur.retouche == 0) {
						ordinateur.retouche=1; move boardingmodified to ordinateur; "C'est simple : vous allez retoucher numériquement la carte d'embarquement et remplacer le nom de Hickens par le vôtre. Puis, en montrant la fausse carte d'embarquement et votre passeport, la sécurité n'y verra que du feu !^^Vous vous armez de patience et minutie et commencez à patiemment retoucher la carte d'embarquement. Copier une lettre, la coller par-dessus une autre, utiliser le pinceau pour atténuer les différences de couleur... Au bout d'un quart d'heure, vous parvenez à obtenir une image qui ressemble à s'y méprendre à une véritable carte d'embarquement @{2014} à part qu'il y a votre nom dessus désormais ! Satisfait, vous sauvegardez le fichier sur l'ordinateur.";
						}
					else {"Franchement, vous êtes assez fier de ce que vous en avez fait ; il n'y a pas besoin de plus de retouches.";}
					}
				    else {"Cette carte est bien réelle, et ils n'ont pas encore créé de logiciels de retouche de la réalité...";}
		Drop: if (player in security1) {move self to casier; "Vous posez la carte d'embarquement valide dans le casier @{2014} à l'envers, pour ne pas éveiller les soupçons, et en priant pour qu'aucun des agents ne remarque que ce petit bout de papier ressemble à une carte d'embarquement et décide de l'examiner de plus près...";}
		Taste, Touch, Smell: if (self in ordinateur) {"Impossible ; ça n'est qu'un fichier sur un ordinateur.";}
		],
has female ;


Object boardingmodified "carte d'embarquement pour vous (retouchée)"
	with description "Cette carte d'embarquement est à votre nom ! Mais il s'agit d'un faux, savamment retouché par vos soins sur l'ordinateur en libre service. Ce faux vous permettra de passer la sécurité ; cependant, puisque les stewards comparent le nom sur la carte d'embarquement et le nom donné par l'ordinateur, il vous faudra également la carte d'embarquement originale pour monter à bord de l'avion. Normalement, ça devrait marcher...",
	parse_name [n t f;
		t = NextWord();
		! Flag pour éviter de gagner >x moi
		f = 0; if (t == 'moi' or 'vous') {f = 1;}
		if (action_to_be == ##Retouche or ##Modifier) {n++;}
		while(t) {
			if (t == 'carte' or 'd^' or 'de' or 'moi' or 'vous' or 'embarquement' or 'boarding' or 'pass' or 'ticket' or 'billet' or 'billets' or 'retouchee' or 'retouche' or 'change' or 'modifie' or 'nouveau' or 'fausse' or 'faux' or 'copie' or 'modifiee' or 'changee' or 'nouvelle' or 'contrefait' or 'contrefaite' or 'contrefacon') {
				n++;
				if (action_to_be == ##Take or ##Imprim && self in ordinateur) {n++;}
				if (action_to_be == ##Buy) {n++;}
				}
			if (self in ordinateur && t == 'pdf' or 'image' or 'fichier' or 'numerique') {n++;}
			t = NextWord();
			! On veut abaisser le drapeau après le premier mot, qui est "moi" ou "vous" si le drapeau est levé
			! Si y'a rien après, ça veut dire que c'est ">x moi" et on veut perdre
			! Si il y a quelque chose après, ça peut être la désambiguation et on veut pouvoir gagner
			!       (la désambiguation met la réponse à "lequel ?" juste après le verbe, puis reparse : p.242 DM4)
			if (f == 1) {f = 0; if (t == 0) {return 0;}}
			}
		return n;
		],
	before [; Imprim: if (self in ordinateur) {imprimerCarte(); rtrue;} else {"Vous avez déjà imprimé cette carte d'embarquement.";}
		Take: switch(parent(self)) {
			casier: if (player in security1 && agente.passed==1) {"Comme l'agente vous l'a dit, vous devez mettre tout ce que vous avez sur le tapis roulant. Il va donc falloir vous en séparer pour un petit moment.";}
			ordinateur: imprimerCarte(); rtrue;
			default: rfalse;
			}
		Retouche, Modifier: if (self in ordinateur) {"Franchement, vous êtes assez fier de ce que vous en avez fait ; il n'y a pas besoin de plus de retouches.";} else {"Cette carte est bien réelle, et ils n'ont pas encore créé de logiciels de retouche de la réalité...";}
		Drop: if (player in security1) {move self to casier; "Vous posez la carte d'embarquement retouchée dans le casier.";}
		Taste, Touch, Smell: if (self in ordinateur) {"Impossible ; ça n'est qu'un fichier sur un ordinateur.";}
		Buy: "Vous avez déjà payé pour le billet d'avion sur Internet. Enfin, quand vous dites @<< vous @>>, c'est vrai que ça n'est pas exactement vous...";
		],
has female ;


!==============================
!     Prendre la vraie carte et la carte retouchée

[ imprimerCarte ;
	if (boardingmodified in ordinateur) {
		move boardingmodified to player;
		print "Vous avez enfin tout ce qu'il vous faut : vous imprimez alors les cartes d'embarquement pour vous et ";
		if (boardingfanton in ordinateur) {move boardingfanton to player; print "Ben";} else {move boardinghickens to player; print "Chester";}
		". Le plan est de montrer votre fausse carte d'embarquement et votre passeport à la sécurité, qui vous laissera passer, puis de vous servir de la vraie carte d'embarquement pour embarquer, puisqu'ils ne vérifient pas votre identité à ce moment-là !";
		}
	else {
		"Imprimer cette carte d'embarquement ne servirait à rien pour l'instant : le nom sur votre passeport n'est pas celui sur la carte d'embarquement, donc vous n'arriverez pas à passer le point de sécurité avec cette carte d'embarquement ! Il vous faut trouver autre chose.";
		}
];

!==============================
!       Verbes

[ ImprimSub;
	"Il ne s'agit pas de quelque chose que vous pouvez imprimer.";
];

[ RetoucheSub;
	"Vous ne pouvez retoucher que des images.";
];

[ ModifierSub;
	"Vos super-pouvoirs sont malheureusement limités : la seule chose que vous pouvez modifier, ce sont des images.";
];

[ LogicielSub;
	if (ordinateur has on && (location == restau || location == chaise) ) {
		"[Pour retoucher des images, utilisez plutôt la commande >RETOUCHER x]";
		}
	else {"Vous ne voyez pas comment faire cela.";}
];

[ OrdiOnSub;
	if (ordinateur has on) {"L'ordinateur est déjà allumé.";}
	else {
		if (player in chaise) {move player to restau; print "L'ordinateur est à l'autre bout de la plaza ; vous vous levez et vous la traversez, vous dirigeant vers l'ordinateur.^^";}
		if (pieces in player) {
			remove pieces;
			give ordinateur on;
			"Vous introduisez les pièces qui vous restent dans l'ordinateur ; celui-ci, après quelques instants, s'allume et ouvre une nouvelle session.^^Vous avez accès à un logiciel de retouche d'images, à une imprimante, ainsi qu'à Internet @{2014} lancez Internet, donnez un numéro de carte bancaire et vous pouvez obtenir votre billet pour Atlanta ! ";
		}
		else { "Vous jurez dans votre barbe. Apparemment, il vous faut payer pour allumer cet ordinateur, et vous n'avez plus de pièces. Et bien sûr, cette fichue machine ne prend pas les jetons de casino..."; }
	}
];

[ InternetSub;
	if (location == restau || location == chaise){
		if (ordinateur has on){
			if (bought==0) {
				if (player in chaise) {move player to restau; print "L'ordinateur est à l'autre bout de la plaza ; vous vous levez et vous la traversez, vous dirigeant vers l'ordinateur.^^";}
				print "Vous lancez Internet, et trouvez très vite un site vous permettant de réserver en dernière minute des billets d'avion. Voyons voir..."; w8(); ShowMenu(ordimenu); rtrue;
				}
			else {"Vous vous sentez déjà coupable d'avoir acheté un billet avec une carte qui n'est pas la vôtre ; vous n'allez pas en acheter d'autres.";}
			}
		else {"Il y a bien un ordinateur ici, mais il faut l'allumer pour y ouvrir une session @{2014} ce qui vous coûtera quelques pièces...";}
		}
	else {"Vous ne voyez aucun ordinateur sur lequel vous pourriez surfer sur Internet.";}
];

[ AchatBilletSub ;
	if (location == restau || location == chaise) {<<Internet>>;}
	if (location == jetblue or staralliance or delta or united or american) {"Vous ne voyez pas très bien comment faire : les bornes servent uniquement à imprimer sa carte d'embarquement quand on a réservé son billet pour un vol, et au guichet de la compagnie aérienne on vous demanderait de fournir une carte bancaire.";}
	"Vous ne voyez rien de tel, à moins que cela ne soit sans grande importance.";
];

[ AchatBilletOrdiSub ;
	if (noun == ordinateur) {<<Internet>>;}
	if (noun == bornes) {"Ces bornes servent uniquement à imprimer sa carte d'embarquement quand on a réservé son billet pour un vol.";}
	"Vous ne voyez rien de tel, à moins que cela ne soit sans grande importance.";
];