Can i get some help with this script?

Josan12

Vault Senior Citizen
I'm trying to use this script by Lich - it makes dude_obj fall down on a bed, display a float message and rest for 12 hours. I've changed it from a spatial proc to a use proc so i can easily assign it to bed scenery items.

Now, i've managed to make the script work, except

a) dude_obj won't play his fall down animations.
b) he just stands there and displays 'error' while the 12 hrs pass.

I haven't set a message to display so i can see why it says 'error'. Can anyone tell me

a) why he isn't animating?
b) how i enter a message to display?

Here's the script code:

Code:
procedure use_p_proc;
procedure start;

procedure start begin
end

procedure use_p_proc begin
variable temp;
temp := random( 100, 105 );

if (source_obj == dude_obj) then begin
script_overrides;

reg_anim_begin();
reg_anim_animate(dude_obj, ANIM_fall_back, -1);
reg_anim_end();

critter_heal(dude_obj,999);
game_time_advance(12 * ONE_GAME_HOUR);

float_msg(dude_obj,mstr(temp),2);

end
end

Thanks
 
*****************************************************


#include "..\headers\define.h"

#define NAME SCRIPT_ARTEMPLE

#include "..\headers\command.h"
#include "..\headers\ModReact.h"

procedure start;
procedure use_p_proc;

variable temp;


procedure start begin
end

procedure use_p_proc begin
//variable temp;
temp := random(100, 105);

if (source_obj == dude_obj) then begin
script_overrides;


//gfade_out(1000);
reg_anim_clear(dude_obj);
reg_anim_begin();
reg_anim_animate(dude_obj, ANIM_fall_back_sf, -1);
//animate_set_frame(ANIM_fall_back_sf);
reg_anim_end();
//gfade_in(1000);

//anim({ObjectPtr who}, {int anim}, {int direction});
//animate_set_frame({int newFrame});
//reg_anim_clear(dude_obj);


critter_heal(dude_obj,999);
game_time_advance(12 * ONE_GAME_HOUR);

//float_msg(dude_obj,mstr(temp),2);


if (temp == 100) then float_msg(dude_obj,"str 100",2);
else if (temp == 101) then float_msg(dude_obj,"str 101",2);
else if (temp == 102) then float_msg(dude_obj,"str 102",2);
else if (temp == 103) then float_msg(dude_obj,"str 103",2);
else if (temp == 104) then float_msg(dude_obj,"str 104",2);
else if (temp == 105) then float_msg(dude_obj,"str 105",2);

end
end


*****************************************************
 
Thanks alot Jordan! That script works great so far, though i have a few kinks to work out yet.

Can anyone tell me where i can find a list of which script commands relate to which animations?
I mean for example:

ANIM_fall_back_sf = XXXXXXRA .FRM filename (critter on back but not dead)

???

EDIT: i figured it out from this thread @ DAC: http://www.duckandcover.cx/forums/viewtopic.php?t=3740

EDIT2: @ Jordan - why did you disable the 'gfade' commands? I tried to re-enable them but they won't play at the correct time. I noticed on his webpage Lich said he had to disable the 'gfade' as it didn't work correctly ....
 
I think I prefer ANIM_fall_back without the _sf at the end, cause then the critter falls down instead of just popping to the ground right away.

Also I think it would be better if the floats could be delayed a couple of seconds so you have time to lay down and relax before they start. :)
I could not figure out how to do do that though.
 
Darek said:
I think I prefer ANIM_fall_back without the _sf at the end, cause then the critter falls down instead of just popping to the ground right away.

But this isn't needed, if you let the screen fade out and in before and after.

Can anyone tell me where i can find a list of which script commands relate to which animations?
I mean for example:

ANIM_fall_back_sf = XXXXXXRA .FRM filename (critter on back but not dead)

???

Try to use a search in files search function. I am not 100% sure at the moment, but I think the animation names are in the defines.h or so.
 
Darek said:
I think I prefer ANIM_fall_back without the _sf at the end, cause then the critter falls down instead of just popping to the ground right away.

I tinkered with Jordans script and improved it - i'm especially proud of using the animate_reverse command on the CJ (get up) animation ;) :

Code:
#include "..\headers\define.h"

#define NAME                    SCRIPT_BED

#include "..\headers\command.h"

procedure start;
procedure use_p_proc;

variable temp;


procedure start begin
end

procedure use_p_proc begin
//variable temp;
temp := random(100, 105);

if (source_obj == dude_obj) then begin
script_overrides;

reg_anim_clear(dude_obj);
reg_anim_begin();
reg_anim_animate_reverse(dude_obj, 37, -1);
reg_anim_animate(dude_obj, ANIM_fall_back_sf, -1); 
//animate_set_frame(ANIM_fall_back_sf);
reg_anim_end();

//anim({ObjectPtr who}, {int anim}, {int direction});
//animate_set_frame({int newFrame});
//reg_anim_clear(dude_obj);

gfade_out(600);
critter_heal(dude_obj,(10 + dude_endurance));
game_time_advance((13 - dude_endurance)* ONE_GAME_HOUR);
gfade_in(600);
//float_msg(dude_obj,mstr(temp),2);

if (temp == 100) then float_msg(dude_obj,"str 100",2);
else if (temp == 101) then float_msg(dude_obj,"zzzzzzz",2);
else if (temp == 102) then float_msg(dude_obj,"snort ... hmph .. zzz",2);
else if (temp == 103) then float_msg(dude_obj,"zzzz .... i am chosen ... zzzz ...",2);
else if (temp == 104) then float_msg(dude_obj,"snore",2);
else if (temp == 105) then float_msg(dude_obj,"zzzzzzzzz",2);

end
end

Darek said:
Also I think it would be better if the floats could be delayed a couple of seconds so you have time to lay down and relax before they start. :)
I could not figure out how to do do that though.

Yeah - i can't figure it out either. Can someone help with how to delay the floats? Also - the gfade command seems to be wierd - i can't time it to fade out AFTER the animations have played, and fade in AFTER the time has passed. Everything just wants to happen simultaneously. Can anyone help with this?

Lexx said:
Try to use a search in files search function. I am not 100% sure at the moment, but I think the animation names are in the defines.h or so.

Here's the info i found on DAC for anyone who needs it ... the two letters correspond to the last two letters in the appropriate FRM file name:

Code:
Code:
  AA  0     AK  10     BA  20     BK  30
  AB  1     AL  11     BB  21     BL  31
  AC  2     AM  12     BC  22     BM  32
  AD  3     AN  13     BD  23     BN  33
  AE  4     AO  14     BE  24     BO  34
  AF  5     AP  15     BF  25     BP  35
  AG  6     AQ  16     BG  26     CH  36
  AH  7     AR  17     BH  27     CJ  37
  AI  8     AS  18     BI  28     GC  38
  AJ  9     AT  19     BJ  29
 
Code:
if (temp == 100) then float_msg(dude_obj,"str 100",2);
else if (temp == 101) then float_msg(dude_obj,"zzzzzzz",2);
else if (temp == 102) then float_msg(dude_obj,"snort ... hmph .. zzz",2);
else if (temp == 103) then float_msg(dude_obj,"zzzz .... i am chosen ... zzzz ...",2);
else if (temp == 104) then float_msg(dude_obj,"snore",2);
else if (temp == 105) then float_msg(dude_obj,"zzzzzzzzz",2);

You don't need all this code. There is a command with that you can floode random text lines.

Code:
floater_rand(100, 105);

This should be the command, if I remember correctly... I don't have the code in front of me at the moment.
 
@ Lexx
You mean using a *.msg file for the text like this? (OBJ_DUDE.MSG in this example.)
Code:
float_msg(dude_obj, message_str(1,random(100, 105)), 2);

Josan12 said:
Yeah - i can't figure it out either. Can someone help with how to delay the floats? Also - the gfade command seems to be wierd - i can't time it to fade out AFTER the animations have played, and fade in AFTER the time has passed. Everything just wants to happen simultaneously. Can anyone help with this?
Can't that be done sequentially? Have a look at eckaga1.int and see how killap did there, it may be helpful.
Edit: You forgot to write a text string for float 100.
 
Darek said:
@ Lexx
You mean using a *.msg file for the text like this? (OBJ_DUDE.MSG in this example.)
Code:
float_msg(dude_obj, message_str(1,random(100, 105)), 2);

Yes. It is always better to use text from *.msg files because of easier editing and maybe for translating and so on.

Yeah - i can't figure it out either. Can someone help with how to delay the floats?

You need to make a fake-loop with timed_event_p_proc. You start a timer event and in the timer_event procedure you start the next timer event, etc. I would show you an example for this but like I wrote above... I don't have access to the code at the moment. :/
 
Lexx said:
You need to make a fake-loop with timed_event_p_proc. You start a timer event and in the timer_event procedure you start the next timer event, etc. I would show you an example for this but like I wrote above... I don't have access to the code at the moment. :/

Thanks Lexx. I've taken a look at akaga.int - it's pretty complicated and i'm struggling to understand it. Can anyone help explain to me how timed_event procedures work?
 
Yeah, Kaga was a bit too complicated for me as well, so I looked at ECBHEAD.SSL instead (stonehead random encounter). I don't know if this is what Lexx meant, but I put everything in sequence and used blank floats to delay the text.
I'm just trying to learn something here. Have a look and see if you can use anything.
Oh, and I'm not sure about the fade out, it don't work for me, maybe it's the high res patch or something.

Code:
#include "..\headers\define.h"

#define NAME                    SCRIPT_BED

#include "..\headers\command.h"


procedure start;
procedure use_p_proc;
procedure sequence;
variable count;
procedure timed_event_p_proc;


procedure start
begin
end

procedure use_p_proc
begin
if not (game_ui_is_disabled) then
game_ui_disable;
reg_anim_clear(dude_obj);
reg_anim_begin();
reg_anim_animate_reverse(dude_obj, 37, -1);
reg_anim_animate(dude_obj, ANIM_fall_back_sf, -1);
reg_anim_end();
call sequence;
end

procedure sequence
begin
if (count == 0) then begin
float_msg(dude_obj, "", 3);
end
else begin
if (count == 1) then begin
float_msg(dude_obj, "zzzzzzz.", 3);
end
else begin
if (count == 2) then begin
gfade_out(600);
critter_heal(dude_obj,(10 + dude_endurance));
game_time_advance((13 - dude_endurance)* ONE_GAME_HOUR);
gfade_in(600);
display_msg(message_str(1, 160));
end
else begin
if (count == 3) then begin
float_msg(dude_obj, message_str(1,random(161, 165)), 3);		
end
else begin
if (count == 4) then begin
float_msg(dude_obj, "", 3);
end
else begin
if (count == 5) then begin
reg_anim_clear(dude_obj);
reg_anim_begin();
reg_anim_animate(dude_obj, 37, -1);
reg_anim_end();	
if (game_ui_is_disabled) then
game_ui_enable;
end
end
end
end
end
end
count := count + 1;
if (count > 5) then begin
count := 0;
end
else begin
add_timer_event(self_obj, game_ticks(3), 1);
end
end

procedure timed_event_p_proc
begin
if (fixed_param == 1) then begin
call sequence;
end
end
I added these lines into OBJ_DUDE.MSG
Code:
{160}{}{ You sleep several hours.}
{161}{}{ zzzzzzz.}
{162}{}{ snort ... hmph .. zzz.}
{163}{}{ zzzz .... i am chosen ... zzzz ....}
{164}{}{ snore.}
{165}{}{ zzzzzzzzz.}

Edit: When I removed the High res patch I got a fade out, only for a blink of an eye though. How long is it supposed to be?
 
Hey Darek! You the man! You got it to do exactly what i wanted. Awesome. Now i just have to try to understand how the hell you did it or i'll never learn :)

I have several plans for this script:

1) I was planning on remaking most - if not all maps with new beds with this script attached. Unfortunately it doesn't really work on the the beds that aren't flat - unless there's a way to 'offset' the dude onto the hex of the scenery object (that would normally block movement), and then run the sequence - does anyone know if this could be done?

1) I was thinking this script could be slotted into various 'townsfolk' scripts to make them seek out a bed, and go to sleep. I figure it might make them a little more believable if they did it at night

3) Alternatively, i thought i could assign this script to beds that you can pay for - which as they are are completely pointless and a waste of money. But as it is you can just walk into the 'pay-for-rooms' anyway, so there'd have to be a script assigned where these rooms would be locked until paid for. Also, i'd make more maps 'rest here = no' on worldmap.txt so as to encourage bed use. I was thinking the random encounter maps so that you can only rest in a town or in a bed.

Any thoughts?
 
Hi Josan, nice idea :)
Darek, very good script :)

I make a small improvenments to script:

Code:
#include "..\headers\define.h"

#define NAME                    SCRIPT_BED

#include "..\headers\command.h"


procedure start;
procedure use_p_proc;
procedure sequence;
variable count;
procedure timed_event_p_proc;


procedure start
begin
end

procedure use_p_proc
begin
   script_overrides;

   if not (game_ui_is_disabled) then
      game_ui_disable;

   reg_anim_clear(dude_obj);
   reg_anim_begin();
   reg_anim_animate_reverse(dude_obj, 37, -1);
   reg_anim_animate(dude_obj, ANIM_fall_back_sf, -1);
   reg_anim_end();

   call sequence;
end

procedure sequence
begin
   if (count == 0) then 
	begin
      float_msg(dude_obj, mstr(150), 3);
   end
   else 
	begin
      if (count == 1) then 
		begin
         float_msg(dude_obj, mstr(random(161, 165)), 3);
      end
      else 
		begin
         if (count == 2) then 
			begin
            gfade_out(600);
              critter_heal(dude_obj,(10 + dude_endurance));
              game_time_advance((13 - dude_endurance)* ONE_GAME_HOUR);
            gfade_in(600);
            float_msg(dude_obj, mstr(random(161, 165)), 3);
         end
         else 
			begin
            if (count == 3) then 
				begin
               float_msg(dude_obj, mstr(random(161, 165)), 3);      
            end
            else 
				begin
               if (count == 4) then 
					begin
                  display_msg(mstr(160));   
               end
               else 
					begin
                  if (count == 5) then 
						begin
                     float_msg(dude_obj, mstr(151), 3);						
                     reg_anim_clear(dude_obj);
                     reg_anim_begin();
                     reg_anim_animate(dude_obj, 37, -1);
                     reg_anim_end();                         
                     if (game_ui_is_disabled) then
                        game_ui_enable;                                             
                  end
               end
            end
         end
      end
   end

   count := count + 1;
   if (count > 5) then begin
      count := 0;
   end
   else 
	begin
      add_timer_event(self_obj, game_ticks(3), 1);
   end
end

procedure timed_event_p_proc
begin
   if (fixed_param == 1) then 
	begin
      call sequence;
   end
end


I added these lines to new BED.MSG file. Not to OBJ_DUDE.MSG. That is better way.

Code:
{150}{}{You are going to slepp.}
{151}{}{You wake up slowly and feel healthy.}

{160}{}{ You sleep several hours.}
{161}{}{ zzzzzzz.}
{162}{}{ snort ... hmph .. zzz.}
{163}{}{ zzzz .... i am chosen ... zzzz ....}
{164}{}{ snore.}
{165}{}{ zzzzzzzzz.}


You need place a bed on a map. attache a script and play :)
The bed need has an ACTION FLAG set to "usable" in mapper.
 
Thanks guys. :)

Josan12 said:
1) I was planning on remaking most - if not all maps with new beds with this script attached. Unfortunately it doesn't really work on the the beds that aren't flat - unless there's a way to 'offset' the dude onto the hex of the scenery object (that would normally block movement), and then run the sequence - does anyone know if this could be done?
It would also be nice if the dude could move away a couple of hexes from the bed when he wakes up.
I don't know if "animate_move_to_tile" could be used or if that is more like teleporting. If you are going to move the dude to different tiles, I believe you will need unique scripts for every bed.
I was thinking, when you sleep with the Bishop women, they are placed on their beds. Isn't that exactly what you are looking for?

Josan12 said:
2) I was thinking this script could be slotted into various 'townsfolk' scripts to make them seek out a bed, and go to sleep. I figure it might make them a little more believable if they did it at night.
IIRC this was done in Fallout Tactics (raiders). I like the idea.

Josan12 said:
3) Alternatively, i thought i could assign this script to beds that you can pay for - which as they are are completely pointless and a waste of money. But as it is you can just walk into the 'pay-for-rooms' anyway, so there'd have to be a script assigned where these rooms would be locked until paid for. Also, i'd make more maps 'rest here = no' on worldmap.txt so as to encourage bed use. I was thinking the random encounter maps so that you can only rest in a town or in a bed.
I like this idea as well. Maybe it could be done so that if you sleep in a proper bed in a safe location, you heal faster, but also make it so you can sleep on an old rug or mattress for normal healing rate. At least in the early game when the player is low on cash, the second option would be good.

@ Cubik2k
I only put the text in obj_dude as an example, it was not meant to be used that way. And to be honest I don't know how to attach bed.msg to bed.ssl, I'm not very experienced with these things.
Oh, what is "script_overrides;" for and why is it needed in procedure use_p_proc?
I wasn't happy that you removed my silent bits so I changed the script a little bit again. :P
Also, I found out I don't need a blank text string to get the pause I wanted.
Code:
#include "..\headers\define.h"

#define NAME                    SCRIPT_BED

#include "..\headers\command.h"


procedure start;
procedure use_p_proc;
procedure sequence;
variable count;
procedure timed_event_p_proc;


procedure start
begin
end

procedure use_p_proc
begin
   script_overrides;

   if not (game_ui_is_disabled) then
      game_ui_disable;

   reg_anim_clear(dude_obj);
   reg_anim_begin();
   reg_anim_animate_reverse(dude_obj, 37, -1);
   reg_anim_animate(dude_obj, ANIM_fall_back_sf, -1);
   reg_anim_end();
   display_msg(mstr(150));
   call sequence;
end

procedure sequence
begin
   if (count == 0) then
   begin
   end
   else
   begin
      if (count == 1) then
      begin
         float_msg(dude_obj, mstr(160), 3);
      end
      else
      begin
         if (count == 2) then
         begin
            gfade_out(600);
              critter_heal(dude_obj,(10 + dude_endurance));
              game_time_advance((13 - dude_endurance)* ONE_GAME_HOUR);
            gfade_in(600);
            display_msg(mstr(151));
         end
         else
         begin
            if (count == 3) then
            begin
            float_msg(dude_obj, mstr(random(161, 165)), 3);
            end
            else
            begin
               if (count == 4) then
               begin
               end
               else
               begin
                  if (count == 5) then
                  begin
                     display_msg(mstr(152));
                     reg_anim_clear(dude_obj);
                     reg_anim_begin();
                     reg_anim_animate(dude_obj, 37, -1);
                     reg_anim_end();
                     if (game_ui_is_disabled) then
                        game_ui_enable;
                  end
               end
            end
         end
      end
   end

   count := count + 1;
   if (count > 5) then begin
      count := 0;
   end
   else
   begin
      add_timer_event(self_obj, game_ticks(3), 1);
   end
end

procedure timed_event_p_proc
begin
   if (fixed_param == 1) then
   begin
      call sequence;
   end
end

And for bed.msg
Code:
{150}{}{You lay down and quickly pass out.}
{151}{}{You sleep for several hours.}
{152}{}{You wake up slowly and you feel a bit better.}

{160}{}{ Zzzzzzzz.}
{161}{}{ zzzzzzz.}
{162}{}{ snort ... hmph .. zzz.}
{163}{}{ zzzz .... i am chosen ... zzzz ....}
{164}{}{ snore.}
{165}{}{ zzzzzzzzz.}
I prefer to have lines 150 -152 be shown in the message window instead of having them as floats.

cheers
 
I've been investigating a way to apply the above sleeping script to townsfolk. At 9pm i want them to:

a) find a (flat) bed
b) run the above script (lie down, display floats)
c) at 8am get up and resume their normal script activity

MIB88 and i have been discussing how to implement this idea but there is one key problem: many of the 'generic' townsfolk (such as the 'Den junkie') use the same script. Thus they would all follow the same script and try to converge on the same spot, and probably crash the game or mill aimlessly all night.

So i'm throwing this out to the community to see if anyone can think of a solution? Or maybe a better way to, basicly, make townsfolk go to sleep at night?
 
The simplest way would obviously be to assign one bed per person (and use individual scripts), but then the maps would have to be changed. Is that what you are trying to avoid?
I don't know the correct commands, but would it be possible to do something like this:

Code:
procedure critter_p_proc begin
 if ((game_time_hour > 001) and (game_time_hour < 801)) then begin
 If LvarBed=0 move to hex 21000
 If LvarBed=1 move to hex 21001
 If LvarBed=2 move to hex 21002
 If LvarBed=3 move to hex 21003
 If LvarBed=4 move to hex 21004
  if self_obj is at hex 21000 set LvarBed to 1
  (Run the whole sleep sequence thing)
   if self_obj is at hex 21001 set LvarBed to 2
    (Run the whole sleep sequence thing)
      repeat for every bed...

I don't know if the game counts multiple instances of the same script as one or treat them separately.
If the latter is the case Mvars would have to be used instead of Lvars.
Also the sleep sequence would have to be split into two, one for going to bed and a second for waking up at the correct time.

You can check the Dunton brothers script for ideas. They share the same script and move to a certain hex at a certain time. I haven't looked at it, but I know they never stand on the same tile, so maybe there is something useful in there to prevent the critters to go for the same bed.

What do you think?
 
Josan12 said:
I've been investigating a way to apply the above sleeping script to townsfolk. At 9pm i want them to:

a) find a (flat) bed
b) run the above script (lie down, display floats)
c) at 8am get up and resume their normal script activity

MIB88 and i have been discussing how to implement this idea but there is one key problem: many of the 'generic' townsfolk (such as the 'Den junkie') use the same script. Thus they would all follow the same script and try to converge on the same spot, and probably crash the game or mill aimlessly all night.

So i'm throwing this out to the community to see if anyone can think of a solution? Or maybe a better way to, basicly, make townsfolk go to sleep at night?
You might want script to choose a random time for critters to go to sleep and wake up; sleep any time from 9pm to 2am, wake any time from 5am to 10am.
Might help the town's people to seem more realistic rather than the entire town suddenly sleeps at 9pm and wakes at 8am.
Just throwing in my two cents; use or toss back, just trying to be helpful.

EDIT:
Might also see if it's possible to check if a bed already contains one or two critters and then not allow a third and force the critter to seek out another bed.

Also would need a check I guess for if no beds were available thus forcing the critter to stay up all night - also would add to realism.
 
I like your ideas Glovz, but the question is how to do it. How do you get a random time, is it even possible?
Maybe can get around that by choosing between a few predefined times?

This is some tricky stuff.
Anyway, the simplest thing really would be to only have one critter per bed, with their own script, and they can easily be made to go to bed at different times (not randomly).
Is it really worth all the extra trouble getting random people to go to bed at random times? Someone will be sleeping in the beds anyway.
 
Darek said:
Code:
procedure critter_p_proc begin
 if ((game_time_hour > 001) and (game_time_hour < 801)) then begin
 If LvarBed=0 move to hex 21000
 If LvarBed=1 move to hex 21001
 If LvarBed=2 move to hex 21002
 If LvarBed=3 move to hex 21003
 If LvarBed=4 move to hex 21004
  if self_obj is at hex 21000 set LvarBed to 1
  (Run the whole sleep sequence thing)
   if self_obj is at hex 21001 set LvarBed to 2
    (Run the whole sleep sequence thing)
      repeat for every bed...

Thanks Darek! So if i understand correctly are you suggesting i assign a list of beds (hexes) to the generic critter script. Then have them select one at random. So the final result will be that most critters find seperate beds. Some, of course, will choose beds already taken - so i guess i need to test to see what happens.

Darek said:
Also the sleep sequence would have to be split into two, one for going to bed and a second for waking up at the correct time.

Ok. So does that mean going to bed and getting up need seperate procs?

Darek said:
You can check the Dunton brothers script for ideas. They share the same script and move to a certain hex at a certain time. I haven't looked at it, but I know they never stand on the same tile, so maybe there is something useful in there to prevent the critters to go for the same bed.

Good idea. I'll look into it and post what i find.

@ Glovz: i like your 'random bedtime/wake up' idea. But first i need to solve the above problem before i can consider such details.
 
Amusingly, I tried to implement some scheduled sleeping in Fo1, but it was low priority.

For the beds, here's my recommendation.
Have a list of available beds. Pass a pointer to the top of the list into a global variable. (You can do this on map entry, for instance.) When a critter looks for a bed, peel the pointer off the global variable if it's non-null, then null the global. In the map heartbeat script, if the global is null, move to the next element on the list. This means that on each map heartbeat it will update the global, the first critter to poll will pull that global, and it will null the global and repeat. If you have at least as many beds as you have critters, they will all find beds.
Note that if you want a critter to use a specific bed, you should create a variable that you export from the bed so that the critter can see the bed and grab a pointer to it specifically. The above system will seem to be mostly "random."
 
Back
Top