Jump to content
  • 0
Timokha

How to limit random event

Question

Hi All !

 

I have a simple script-function, which randomly triggers different events.

 

I am searching for a solution to make the following,

 

if the event from "case 0" (or another cases) is ALREADY triggered with this function,

then next time this function will call another random event except for "case 0" or another. 

 

Example (in random): case 3 -> case 1 -> case 2 -> case 5 -> case 0.

None of these cases is repeated.

 

After all I have to see the following,

 

After using this function 5 times all 5 events have been randomly used (only once),

and in the end the function calls another event, which will define, that all 5 events finally triggered.

function	script	MY_FUNCTION	{

		switch( rand(5) ) {
			case 0: 
				//do that;
				end;
			
			case 1: 
				//do that;
				end;
			
			case 2: 
				//do that;
				end;
				
			case 3: 
				//do that;
				end;
			
			case 4: 
				//do that;
				end;
		}
}

I was thinking to use variables for each "case", but don't know, how to exclude the "case",

when the script goes through "rand" function. I have to save triggering these events in random order.

		switch( rand(5) ) {
			case 0: 
				//do that;
				set CASE_0_USED, 1;
				end;

Any suggestions please?

 

Thank you. 

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 0
//Add a call function in item
// callfunc "Boxx";

function	script	Boxx	{

	//Item ID
	//==
	setarray .@ItemID[0],1108,2104,5011,2301,2404;
	setarray .@itemRF[0],  10,  10,  10,   7,  10;

	//check if you still have an item with a refine lower than 10
	//==
	for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1)
		if((getd("eqi_"+.@ItemID[.@i])-1) < .@itemRF[.@i]) setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i];
	
	//All max refined
	//==
	if(!getarraysize(.@equips)){ dispbottom "Bye bye."; end; }
	
	set .@idx,rand(getarraysize(.@equips));
	set .@slot,getiteminfo(.@equips[.@idx],ITEMINFO_LOC);
	
	switch(.@slot)
	{
		case 2: set .@slot,EQI_HAND_R; break;
		case 16: set .@slot,EQI_ARMOR; break;
		case 32: set .@slot,EQI_HAND_L; break;
		case 64: set .@slot,EQI_SHOES; break;
		case 256: set .@slot,EQI_HEAD_TOP; break;
	}	

	if(getd("eqi_"+.@equips[.@idx]))
	{		
		if(!countitem(.@equips[.@idx])){ dispbottom "Item not found "+getitemname(.@equips[.@idx])+"!"; end; }
		if(getequipid(.@slot) != .@equips[.@idx]) equip .@equips[.@idx];

		successrefitem .@slot;
		setd "eqi_"+.@equips[.@idx],getd("eqi_"+.@equips[.@idx])+1;
	}
	else
	{ setd "eqi_"+.@equips[.@idx],1; getitem .@equips[.@idx],1; }
	
end;
}

I haven't tested it, check if it will work as you wanted.

Share this post


Link to post
Share on other sites
  • 0

tell me a little more about it, I need to understand the reason and why you will call again and again until the 5 cases are completed.

so that I can make a suitable solution for the situation.

Share this post


Link to post
Share on other sites
  • 0
5 hours ago, Hyroshima said:

tell me a little more about it, I need to understand the reason and why you will call again and again until the 5 cases are completed.

so that I can make a suitable solution for the situation.

Hyroshima, many thanks for your reply.

Sure will share more details.

 

I am working on script-function that will be called from an item.

{
	Id: 30000
	AegisName: "XXXX"
	Name: "Box"
	Type: "IT_USABLE"
	Script: <" callfunc "MY_FUNCTION"; ">
},

The main idea, why I do not use "getrandgroupitem", cause inside any case I have 10 event-levels.

At the first level, the player will get an equipment (as example),

and at the next levels from 2 to 10, the player's equipment will be refined.

Each case has different type of equipment (to get and refined).

Below you can find "case 0" sample,

			case 0: 
				if ( CASE0_ITEM == 0 ) {
					set CASE0_ITEM,1;
					getitem EQUIPMENT_0,1;
					dispbottom "[SYSTEM] You've just received EQUIPMENT_0.";
					end;}
				if ( CASE0_ITEM == 10 ) {
					// Here I have to stop producing refine levels
					// And jump to another "cases" if available,
					// cause my equipment reached the max level
					end;}
				set (CASE0_ITEM,CASE0_ITEM+1);
				// REFINE FUNCTION HERE
				dispbottom "[SYSTEM] Your EQUIPMENT_0 has been refined to LEVEL '" + CASE0_ITEM + "'.";
				end;

So I am seeking for solution, how to stop random calling "case 0", if variable "CASE0_ITEM" reached value 10. 

 

Share this post


Link to post
Share on other sites
  • 0

Sorry but it's still a little confusing for me to understand.

let's do it like this, tell me what you want the script to do, so that instead of looking for a solution for this model you mentioned, I can create one without using your base.

🙂

without using codes, just place an order xD

Edited by Hyroshima

Share this post


Link to post
Share on other sites
  • 0
16 minutes ago, Hyroshima said:

Sorry but it's still a little confusing for me to understand.

let's do it like this, tell me what you want the script to do, so that instead of looking for a solution for this model you mentioned, I can create one without using your base.

🙂

Heh... 🤣

Ok, I need to create an item - "BOX".

When the player opens the BOX, he receives one of five items (randomly):

1. Helmet

2. Armor

3. Boots

4. Sword

5. or Shield

 

Next time, if the player opens the BOX and receives the same item,

This item refines to next level +2, if again +3, and so up to level +10.

Quote

IMAGINE: First you opened the BOX and randomly received a shield.

Next time you open this BOX, you CANNOT NOT receive the second shield, 

but your existed shield refines to level +2.

We setup, that the player ALWAYS use this shield and not another.

 

After using the BOX several times, you may have the following equipment:

1. Helmet +5

2. Armor +2

3. Boots +1

4. Sword +3

5. or Shield +10

 

And now HERE, I want to see the following,

Quote

IMAGINE: You opened the BOX many times, and now have a shield +10.

When you open the box again, you can recieve (upgrade refinements) only for:

1. Helmet +5

2. Armor +2

3. Boots +1

4. Sword +3

Cause your shield is already +10

 

And finally, if you have all equipment with refinement level 10:

1. Helmet +10

2. Armor +10

3. Boots +10

4. Sword +10

5. or Shield +10

 

The system just shows you, 

dispbottom "Bye bye.";

 

Yeah, I understand, that it's sound a bit ridiculous, but

it's cause I am trying to create a new mode of gaming in RO 🤣

In addition I mean, that only at the first step in all the cases you receive an item, at all another steps you receives only refinements for this item (equipment).

Share this post


Link to post
Share on other sites
  • 0

I made this model as you explained how it works.

 

//Add a call function in item
// callfunc "Boxx";

function	script	Boxx	{

	//Item ID
	//==
	setarray .@ItemID[0],1108,2104,5011,2301,2404;

	//check if you still have an item with a refine lower than 10
	//==
	for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1)
		if((getd("eqi_"+.@ItemID[.@i])-1) < 10) setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i];
	
	//All refined +10
	//==
	if(!getarraysize(.@equips)){ dispbottom "Bye bye."; end; }
	
	set .@idx,rand(getarraysize(.@equips));
	set .@slot,getiteminfo(.@equips[.@idx],ITEMINFO_LOC);
	
	switch(.@slot)
	{
		case 2: set .@slot,EQI_HAND_R; break;
		case 16: set .@slot,EQI_ARMOR; break;
		case 32: set .@slot,EQI_HAND_L; break;
		case 64: set .@slot,EQI_SHOES; break;
		case 256: set .@slot,EQI_HEAD_TOP; break;
	}	

	if(getd("eqi_"+.@equips[.@idx]))
	{		
		if(!countitem(.@equips[.@idx])){ dispbottom "Item not found "+getitemname(.@equips[.@idx])+"!"; end; }
		if(getequipid(.@slot) != .@equips[.@idx]) equip .@equips[.@idx];

		successrefitem .@slot;
		setd "eqi_"+.@equips[.@idx],getd("eqi_"+.@equips[.@idx])+1;
	}
	else
	{ setd "eqi_"+.@equips[.@idx],1; getitem .@equips[.@idx],1; }
	
end;
}

 

Share this post


Link to post
Share on other sites
  • 0
On 5/13/2022 at 1:29 PM, Hyroshima said:

I made this model as you explained how it works.

 

//Add a call function in item // callfunc "Boxx"; function script Boxx { //Item ID //== setarray .@ItemID[0],1108,2104,5011,2301,2404; //check if you still have an item with a refine lower than 10 //== for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1) if((getd("eqi_"+.@ItemID[.@i])-1) < 10) setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i]; //All refined +10 //== if(!getarraysize(.@equips)){ dispbottom "Bye bye."; end; } set .@idx,rand(getarraysize(.@equips)); set .@slot,getiteminfo(.@equips[.@idx],ITEMINFO_LOC); switch(.@slot) { case 2: set .@slot,EQI_HAND_R; break; case 16: set .@slot,EQI_ARMOR; break; case 32: set .@slot,EQI_HAND_L; break; case 64: set .@slot,EQI_SHOES; break; case 256: set .@slot,EQI_HEAD_TOP; break; } if(getd("eqi_"+.@equips[.@idx])) { if(!countitem(.@equips[.@idx])){ dispbottom "Item not found "+getitemname(.@equips[.@idx])+"!"; end; } if(getequipid(.@slot) != .@equips[.@idx]) equip .@equips[.@idx]; successrefitem .@slot; setd "eqi_"+.@equips[.@idx],getd("eqi_"+.@equips[.@idx])+1; } else { setd "eqi_"+.@equips[.@idx],1; getitem .@equips[.@idx],1; } end; }

 

Hello Hyroshima,

Many thanks for your assistance, that works awesome, as I needed! 😍

 

May you please also advise, what can I change in the script (or add to it),

if I need to change maximum refinement level for one of our listed equipement?

I mean, to make the maximum equipment refinement with the script as follows:

1. Helmet +7

2. Armor +10

3. Boots +10

4. Sword +10

5. Shield +10

 

I guess, I have to add additional condition here:

	//check if you still have an item with a refine lower than 10
	//==
	for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1)
		if((getd("eqi_"+.@ItemID[.@i])-1) < 10) setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i];

I tried something like this, to check variable name (for +10 and +7 equipment), but it doesnt work properly..

	for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1)
		if((getd("eqi_"+.@ItemID[.@i])-1) < 10 && "eqi_"+.@ItemID[.@i] != "eqi_5011") setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i];
		if((getd("eqi_"+.@ItemID[.@i])-1) < 7 && "eqi_"+.@ItemID[.@i] == "eqi_5011") setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i];

So I just wanna check, if I can refine with the script all items (+10), except for helmet (which stops at +7). 🙏

 

Share this post


Link to post
Share on other sites
  • 0
1 hour ago, Hyroshima said:

//Add a call function in item // callfunc "Boxx"; function script Boxx { //Item ID //== setarray .@ItemID[0],1108,2104,5011,2301,2404; setarray .@itemRF[0], 10, 10, 10, 7, 10; //check if you still have an item with a refine lower than 10 //== for(set .@i,0; .@i<getarraysize(.@ItemID); set .@i,.@i+1) if((getd("eqi_"+.@ItemID[.@i])-1) < .@itemRF[.@i]) setarray .@equips[getarraysize(.@equips)],.@ItemID[.@i]; //All max refined //== if(!getarraysize(.@equips)){ dispbottom "Bye bye."; end; } set .@idx,rand(getarraysize(.@equips)); set .@slot,getiteminfo(.@equips[.@idx],ITEMINFO_LOC); switch(.@slot) { case 2: set .@slot,EQI_HAND_R; break; case 16: set .@slot,EQI_ARMOR; break; case 32: set .@slot,EQI_HAND_L; break; case 64: set .@slot,EQI_SHOES; break; case 256: set .@slot,EQI_HEAD_TOP; break; } if(getd("eqi_"+.@equips[.@idx])) { if(!countitem(.@equips[.@idx])){ dispbottom "Item not found "+getitemname(.@equips[.@idx])+"!"; end; } if(getequipid(.@slot) != .@equips[.@idx]) equip .@equips[.@idx]; successrefitem .@slot; setd "eqi_"+.@equips[.@idx],getd("eqi_"+.@equips[.@idx])+1; } else { setd "eqi_"+.@equips[.@idx],1; getitem .@equips[.@idx],1; } end; }


//Add a call function in item
// callfunc "Boxx";

I haven't tested it, check if it will work as you wanted.

It perfectly works!

Thanks a lot for your time and help! 🙏🙏🙏

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.