/* Generated by Naturel. Do not modify. */
/* 1.0.0 - Sun Apr 06 13:52:35 CEST 2008 */

#include "Zahlenraten.h"

Zufallsgenerator createZufallsgenerator() {
	Zufallsgenerator obj = ((Zufallsgenerator)getmem(sizeof(struct SZufallsgenerator)));
	return obj;
}


Zufallsgenerator Zufallsgenerator_new() {
	Zufallsgenerator this = createZufallsgenerator();
	initZufallsgenerator(this);
	return this;
}

void initZufallsgenerator(Zufallsgenerator this) {
	initObject((Object)this);
	((Zufallsgenerator)this)->getRand = Zufallsgenerator_getRand;
	((Zufallsgenerator)this)->varClass_4  = num_new(0);
	((Zufallsgenerator)this)->varClass_3  = num_new(524288);
	((Zufallsgenerator)this)->varClass_2  = num_new(17);
	((Zufallsgenerator)this)->varClass_1  = num_new(137153);
}


num Zufallsgenerator_getRand(Zufallsgenerator this) {
	num varLocal_13;
	num varLocal_14;
	num varLocal_15;
	num varLocal_16;
	num varLocal_17;
	num varLocal_18;
	num varLocal_19;
	num varLocal_20;
	num varLocal_21;
	num varLocal_22;
	num varLocal_23;
	num varLocal_24;
	num varLocal_25;
	varLocal_25  = ((Zufallsgenerator) this)->varClass_4;
	varLocal_24  = varLocal_25;
	varLocal_23  = ((Zufallsgenerator) this)->varClass_2;
	varLocal_22  = varLocal_23;
	varLocal_21  = ((Zufallsgenerator) this)->varClass_1;
	varLocal_20  = ((num) varLocal_21)->multNum((num) varLocal_21, varLocal_24);
	varLocal_19  = ((num) varLocal_20)->addNum((num) varLocal_20, varLocal_22);
	varLocal_18  = varLocal_19;
	varLocal_17  = ((Zufallsgenerator) this)->varClass_3;
	varLocal_16  = varLocal_17;
	varLocal_15  = ((num) varLocal_18)->modNum((num) varLocal_18, varLocal_16);
	((Zufallsgenerator)this)->varClass_4  = varLocal_15;
	varLocal_14  = ((Zufallsgenerator) this)->varClass_4;
	varLocal_13  = varLocal_14;
	return varLocal_13;
}
Zahlenraten createZahlenraten() {
	Zahlenraten obj = ((Zahlenraten)getmem(sizeof(struct SZahlenraten)));
	return obj;
}

str varClass_6;
str varClass_7;
str varClass_8;
str varClass_9;
str varClass_10;

Zahlenraten Zahlenraten_new(num varParam_11 ) {
	Zahlenraten this = createZahlenraten();
	initZahlenraten(this, varParam_11);
	((Zufallsgenerator)this)->varClass_4  = varParam_11;
	return this;
}

void initZahlenraten(Zahlenraten this, num varParam_11 ) {
	initZufallsgenerator((Zufallsgenerator)this);
	((Zahlenraten)this)->spiel = Zahlenraten_spiel;
	((Object)this)->tostr = Zahlenraten_tostr;
	((Zahlenraten)this)->varClass_5  = num_new(0);
}


str Zahlenraten_tostr(Zahlenraten this) {
	str varLocal_26;
	str varLocal_27;
	str varLocal_28;
	bool varLocal_29;
	bool varLocal_30;
	num varLocal_31;
	str varLocal_32;
	str varLocal_33;
	str varLocal_34;
	str varLocal_35;
	str varLocal_36;
	str varLocal_37;
	num varLocal_38;
	str varLocal_39;
	str varLocal_40;
	varLocal_38  = ((Zahlenraten) this)->varClass_5;
	varLocal_37  = ((Object) varLocal_38)->tostr((Object) varLocal_38);
	varLocal_36  = ((str) varLocal_37)->append((str) varLocal_37, str_new(" Spiel"));
	varLocal_35  = varLocal_36;
	varLocal_34  = str_new("Sie haben bis jetzt ");
	varLocal_33  = ((str) varLocal_34)->append((str) varLocal_34, varLocal_35);
	varLocal_32  = varLocal_33;
	varLocal_31  = ((Zahlenraten) this)->varClass_5;
	varLocal_30  = ((num) varLocal_31)->gt((num) varLocal_31, num_new(1));
	varLocal_29  = varLocal_30;
	if (!(varLocal_29)) goto ifEndLabel_41;
	varLocal_40  = str_new("e");
	varLocal_39  = ((str) varLocal_32)->append((str) varLocal_32, varLocal_40);
	varLocal_32  = varLocal_39;
	ifEndLabel_41:
	varLocal_28  = str_new(" gewonnen.\n");
	varLocal_27  = ((str) varLocal_32)->append((str) varLocal_32, varLocal_28);
	varLocal_32  = varLocal_27;
	varLocal_26  = varLocal_32;
	return varLocal_26;
}

void Zahlenraten_spiel(Zahlenraten this) 	{
	bool varLocal_42;
	bool varLocal_43;
	num varLocal_44;
	num varLocal_45;
	num varLocal_46;
	num varLocal_47;
	num varLocal_48;
	num varLocal_49;
	num varLocal_50;
	bool varLocal_51;
	num varLocal_52;
	num varLocal_53;
	bool varLocal_54;
	bool varLocal_55;
	bool varLocal_56;
	bool varLocal_57;
	bool varLocal_58;
	bool varLocal_59;
	num varLocal_60;
	num varLocal_61;
	num varLocal_62;
	str varLocal_63;
	str varLocal_64;
	str varLocal_65;
	str varLocal_66;
	num varLocal_67;
	num varLocal_68;
	num varLocal_69;
	str varLocal_70;
	str varLocal_71;
	str varLocal_72;
	str varLocal_73;
	str varLocal_74;
	str varLocal_75;
	str varLocal_76;
	str varLocal_77;
	str varLocal_78;
	varLocal_50  = num_new(100);
	varLocal_49  = ((Zufallsgenerator) this)->getRand((Zufallsgenerator) this);
	varLocal_48  = ((num) varLocal_49)->modNum((num) varLocal_49, varLocal_50);
	varLocal_47  = varLocal_48;
	;
	varLocal_45  = num_new(0);
	varLocal_44  = num_new(1);
	varLocal_43  = ((num) varLocal_44)->eq((num) varLocal_44, num_new(1));
	varLocal_42  = varLocal_43;
	whileBeginLabel_79:
	if (!(varLocal_42)) goto whileEndLabel_80;
	varLocal_64  = varClass_6;
	out(varLocal_64);
	varLocal_63  = in();
	varLocal_62  = ((str) varLocal_63)->asnum((str) varLocal_63);
	varLocal_46  = varLocal_62;
	varLocal_61  = num_new(1);
	varLocal_60  = ((num) varLocal_45)->addNum((num) varLocal_45, varLocal_61);
	varLocal_45  = varLocal_60;
	varLocal_59  = ((num) varLocal_46)->eq((num) varLocal_46, varLocal_47);
	varLocal_58  = varLocal_59;
	if (!(varLocal_58)) goto ifEndLabel_81;
	varLocal_78  = ((Object) varLocal_47)->tostr((Object) varLocal_47);
	varLocal_77  = ((str) varLocal_78)->append((str) varLocal_78, str_new(".\n"));
	varLocal_76  = ((str) varClass_7)->append((str) varClass_7, varLocal_77);
	varLocal_75  = varLocal_76;
	out(varLocal_75);
	varLocal_74  = ((Object) varLocal_45)->tostr((Object) varLocal_45);
	varLocal_73  = ((str) varLocal_74)->append((str) varLocal_74, str_new(" Versuche gebraucht.\n"));
	varLocal_72  = str_new("Sie haben ");
	varLocal_71  = ((str) varLocal_72)->append((str) varLocal_72, varLocal_73);
	varLocal_70  = varLocal_71;
	out(varLocal_70);
	varLocal_69  = num_new(1);
	varLocal_68  = ((Zahlenraten) this)->varClass_5;
	varLocal_67  = ((num) varLocal_68)->addNum((num) varLocal_68, varLocal_69);
	((Zahlenraten)this)->varClass_5  = varLocal_67;
	return ;
	ifEndLabel_81:
	varLocal_57  = ((num) varLocal_46)->gt((num) varLocal_46, varLocal_47);
	varLocal_56  = varLocal_57;
	if (!(varLocal_56)) goto ifEndLabel_82;
	varLocal_66  = varClass_8;
	out(varLocal_66);
	ifEndLabel_82:
	varLocal_55  = ((num) varLocal_46)->lt((num) varLocal_46, varLocal_47);
	varLocal_54  = varLocal_55;
	if (!(varLocal_54)) goto ifEndLabel_83;
	varLocal_65  = varClass_9;
	out(varLocal_65);
	ifEndLabel_83:
	varLocal_53  = num_new(1);
	varLocal_52  = num_new(1);
	varLocal_51  = ((num) varLocal_52)->eq((num) varLocal_52, varLocal_53);
	varLocal_42  = varLocal_51;
	goto whileBeginLabel_79;
	whileEndLabel_80:
	return ;
}

num Zahlenraten_main(list varParam_12 ) {
	num varLocal_84;
	bool varLocal_85;
	bool varLocal_86;
	num varLocal_87;
	Zahlenraten varLocal_88;
	Zahlenraten varLocal_89;
	num varLocal_90;
	num varLocal_91;
	str varLocal_92;
	str varLocal_93;
	bool varLocal_94;
	num varLocal_95;
	num varLocal_96;
	str varLocal_97;
	str varLocal_98;
	str varLocal_99;
	str varLocal_100;
	varLocal_93  = str_new("Seed: ");
	out(varLocal_93);
	varLocal_92  = in();
	varLocal_91  = ((str) varLocal_92)->asnum((str) varLocal_92);
	varLocal_90  = varLocal_91;
	varLocal_89  = Zahlenraten_new(varLocal_90);
	varLocal_88  = varLocal_89;
	varLocal_87  = num_new(1);
	varLocal_86  = ((num) varLocal_87)->eq((num) varLocal_87, num_new(1));
	varLocal_85  = varLocal_86;
	whileBeginLabel_101:
	if (!(varLocal_85)) goto whileEndLabel_102;
	((Zahlenraten) varLocal_88)->spiel((Zahlenraten) varLocal_88);
	varLocal_100  = ((Object) varLocal_88)->tostr((Zahlenraten) varLocal_88);
	varLocal_99  = varLocal_100;
	out(varLocal_99);
	varLocal_98  = varClass_10;
	out(varLocal_98);
	varLocal_97  = in();
	varLocal_96  = ((str) varLocal_97)->asnum((str) varLocal_97);
	varLocal_87  = varLocal_96;
	varLocal_95  = num_new(1);
	varLocal_94  = ((num) varLocal_87)->eq((num) varLocal_87, varLocal_95);
	varLocal_85  = varLocal_94;
	goto whileBeginLabel_101;
	whileEndLabel_102:
	varLocal_84  = num_new(0);
	return varLocal_84;
}


void fillClassVars() {
	varClass_6 = str_new("Ihr Versuch: ");
	varClass_7 = str_new("Erraten - die Zahl war ");
	varClass_8 = str_new("Ihre Zahl ist zu gross!\n");
	varClass_9 = str_new("Ihre Zahl ist zu klein!\n");
	varClass_10 = str_new("Noch ein Spiel? [1 = weiter, 0 = ende]: ");
}

int main(int argc, char* argv[]) {
	int i;
#ifdef HANDLE_SIGSEGV
	struct sigaction sa;
#endif
	list sargs;
#ifdef HANDLE_SIGSEGV
	sa.sa_handler = sighandler;
	sa.sa_flags = 0;
	sigaction(SIGSEGV, &sa, NULL);
#endif
	fillClassVars();
	sargs = list_new(NULL, NULL);
	for (i = argc - 1; i >= 0; i--) {
		sargs = list_new((Object)str_new(argv[i]), sargs);
	}
	return Zahlenraten_main(sargs)->val;
}
