//#################################################################################
//#                                                                               #
//# This script file contains an example how to put                               #
//# multiple values in one variable                                               #
//#                                                                               #
//# There is one global variable (global_variable)                                #
//# This will be split up in 8 * 4bit values, that means these values can have a  #
//# value between 0 and 15                                                        #
//#################################################################################


// test script

001-1.gat,45,43,0	script	Tester	125,{
	
	callsub print_vars;
	
	mes "Which value should be updated?";
	input @adr_local;
	mes "new value?";
	input @value_local;
	callsub set_local_value;
	
	callsub print_vars;
	
	close;
	
print_vars:
	callsub get_all_local_values;
	mes "[Testerboy]";
	mes "\"These are your stored values:\"";
	mes "Your value 0 is " + @local_A;
	mes "Your value 1 is " + @local_B;
	mes "Your value 2 is " + @local_C;
	mes "Your value 3 is " + @local_D;
	mes "Your value 4 is " + @local_E;
	mes "Your value 5 is " + @local_F;
	mes "Your value 6 is " + @local_G;
	mes "Your value 7 is " + @local_H;
	next;
	return;
	
get_all_local_values:
	
	set @adr_local, 0;
	callsub get_local_value;
	set @local_A, @value_local;
	
	set @adr_local, 1;
	callsub get_local_value;
	set @local_B, @value_local;

	set @adr_local, 2;
	callsub get_local_value;
	set @local_C, @value_local;

	set @adr_local, 3;
	callsub get_local_value;
	set @local_D, @value_local;

	set @adr_local, 4;
	callsub get_local_value;
	set @local_E, @value_local;

	set @adr_local, 5;
	callsub get_local_value;
	set @local_F, @value_local;

	set @adr_local, 6;
	callsub get_local_value;
	set @local_G, @value_local;

	set @adr_local, 7;
	callsub get_local_value;
	set @local_H, @value_local;

	return;

get_local_value:
	//which local value should be returned?
	//that has to be in @adr_local
	//so @adr_local has to contain a value between 0 and 7
	//the returned value is stored in @value_local 
	if ( @adr_local<0 || @adr_local>7 ) goto get_local_value_error;
	
	set @mask, 15;
	set @shift, 4*@adr_local;
	set @value_local, (global_variable >>@shift)&@mask;
	
	return;
	
get_local_value_error:
	mes "get_local_value: first argument must be between 0 and 7!";
	close2;
	
	
set_local_value:
	//which local value should be set?
	//that has to be in @adr_local
	//so @adr_local has to contain a value between 0 and 7
	//the value to be stored in has to be in @value_local
	//so second argument has to be in range [0, 15]
	if ( @adr_local<0 || @adr_local>7 ) goto set_local_value_error_adr_local;
	if ( @value_local<0 || @value_local>7 ) goto set_local_value_error_value_local;
		
	set @mask, (15 <<(4 * @adr_local));	
	set global_variable, (global_variable & (~(@mask))) | @value_local<<(4*@adr_local);
	
	return;
	
set_local_value_error_adr_local:
	mes "get_local_value: @adr_local must be between 0 and 7!";
	close2;
	
set_local_value_error_value_local:
	mes "get_local_value: @value_local be between 0 and 15!";
	close2;
	
}//end of script





