Timokha 0 Posted May 11, 2022 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. Quote Share this post Link to post Share on other sites
0 Hyroshima 18 Posted May 18, 2022 //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. 1 Timokha reacted to this Quote Share this post Link to post Share on other sites
0 Hyroshima 18 Posted May 12, 2022 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. Quote Share this post Link to post Share on other sites
0 Timokha 0 Posted May 12, 2022 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. Quote Share this post Link to post Share on other sites
0 Hyroshima 18 Posted May 12, 2022 (edited) 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 May 12, 2022 by Hyroshima Quote Share this post Link to post Share on other sites
0 Timokha 0 Posted May 12, 2022 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). Quote Share this post Link to post Share on other sites
0 Hyroshima 18 Posted May 13, 2022 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; } 2 Timokha and IndieRO reacted to this Quote Share this post Link to post Share on other sites
0 Timokha 0 Posted May 16, 2022 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). 🙏 Quote Share this post Link to post Share on other sites
0 Timokha 0 Posted May 18, 2022 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! 🙏🙏🙏 Quote Share this post Link to post Share on other sites
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