Easygoing Eyebeast Thralni Posted August 22, 2008 Share Posted August 22, 2008 I'd like to know if there is a quick and easy way to determine what the highest variable is in a set group of variables. For example: there is variable a, b, c and d. I want to know what the highest one is. Is there a quicker way to do this then the following: Code: if (a > { if (a > c) { if (a > d) { set_flag(x,y,a)}}}// and then do this operation for every other variable Not only is this a lot of work to type out, I fear it may unncesarily slow down the game. Do any of you have a better option available? Quote Link to comment Share on other sites More sharing options...
Well-Actually War Trall Niemand Posted August 22, 2008 Share Posted August 22, 2008 Since we can't write functions in Avernumscript, I think the best way is probably to use an intermediate variable: Code: int a,b,c,d; //the variables we want to find the max ofint e;...e = a;if(b > e) e = b;if(c > e) e = c;if(d > e) e = d;set_flag(x,y,e); It's not really great, but I can't think of anything much better. Note that if you don't mind potentially losing the value in one of the variables you're choosing among, say a, you could use that one instead of the extra one. If you chose a, you could eliminate the assignment and first conditional in the above code, and change all other occurrences of e to a. Quote Link to comment Share on other sites More sharing options...
Unflappable Drayk Lazarus. Posted August 22, 2008 Share Posted August 22, 2008 Do you want to know which variable is highest, or do you want to know the value of the highest variable? If the second, then Niemand's solution. If the first, then you have a few extra hoops to jump through. Quote Link to comment Share on other sites More sharing options...
Easygoing Eyebeast Thralni Posted August 22, 2008 Author Share Posted August 22, 2008 I made a tiny mistake I'm afraid. It's not the highest, rather the lowest variable what I'm looking for. So anyway: I need to know which variable is lowest, not just the value. In town, there are four points. I need to know to which point the party is closest to, so I can spawn a monster at that point. So what I did, is store the distance from the party to each point in a variable, and now I need to know which variable has the lowest value, so I can determine to what point the party is closest. Quote Link to comment Share on other sites More sharing options...
Easygoing Eyebeast Dintiradan Posted August 22, 2008 Share Posted August 22, 2008 (Would have been posted earlier. Server was slow. At least now I can update my code.) How important is it that you use variables? What AvernumScript really needs is arrays, but you could be able to hack it out with SDFs. Code: // i is an integer/short// min_index is an integer/shortmin_index = 0;i = 1;while (i < ARRAY_LENGTH) { if (get_flag(ARRAY_LOCATION, i) > get_flag(ARRAY_LOCATION, min_index)) { min_index = i; } i = i + 1;}// The SDF with the minimum value will be located at (ARRAY_LOCATION, min_index It would be easier if AvernumScript actually had arrays. Or functions. Or macros. Or for loops. Or pre/post incrementing. Or- Quote Link to comment Share on other sites More sharing options...
Well-Actually War Trall Niemand Posted August 22, 2008 Share Posted August 22, 2008 Ah, I misunderstood. If that's what you need, there's no point in storing all the distances at all: Code: int i,index,dist,best_dist;//assume that four locations are stored with//their x and y coordinates for location i in flags//(ARRAY_LOCATION,i) and (ARRAY_LOCATION+1,i)//for i=0,...,3//these could be set by the START_SCEN_STATEi=0;best_dist=5000;while(i<4){ dist = distance from party to the point (get_flag(ARRAY_LOCATION,i),get_flag(ARRAY_LOCATION+1,i) if(dist<best_dist){ best_dist=dist; index=i; } i++;}//point to spwan monster is now://(get_flag(ARRAY_LOCATION,index),get_flag(ARRAY_LOCATION+1,index) Similar to Dintiridan's suggestion, but you might as well just store the coordinates since they have to be stored in some form anyway. This is about how most of Blades of Rogue works. Quote Link to comment Share on other sites More sharing options...
Well-Actually War Trall Ishad Nha Posted August 23, 2008 Share Posted August 23, 2008 My impression is that Avernum script has been simplified way too much. This is only one example, people frequently need to employ circumlocution. All too often something can't be done or it can be done only with a whole lot of convolution. It is not a very satisfactory compromise between C programming and the Blades of Exile way of doing things. Quote Link to comment Share on other sites More sharing options...
Magnificent Ornk Swimmin' Salmon Posted August 23, 2008 Share Posted August 23, 2008 No, but it is what it is, and no amount of complaining about it seems to affect Jeff's willingness to make improvements. Of course, I do understand the implication that you would have done things differently. I think we all would have. And been poor. Quote Link to comment Share on other sites More sharing options...
Easygoing Eyebeast Thralni Posted August 23, 2008 Author Share Posted August 23, 2008 In the end I'll use Niemand's way of doing it I guess, but man, I hardly understand what you are doing there... Could you explain, line for line, slowly, what it is you are doing? For example, I never knew something like i++; can be done, never ever seen it even. Quote Link to comment Share on other sites More sharing options...
Well-Actually War Trall Niemand Posted August 23, 2008 Share Posted August 23, 2008 Oops, I forgot to fully translate everything from C to Avernumscript. Code: int i,index,dist,best_dist;//assume that four locations are stored with//the x and y coordinates for location i in flags//(ARRAY_LOCATION,i) and (ARRAY_LOCATION+1,i)//for i in the range 0,1,2,3//these could be set by the START_SCEN_STATE//i will be our loop counter, as usuali=0;//best_dist is the best distance we've found so far. We start out by setting it to an //impossibly high value to that the first real value we find will replace it. best_dist=5000;//loop over all of the possible spawn points:while(i<4){ //compute the distance from the spawn point currently being considered to the party //note that the next line is only pseudo code, must be replaced with whatever method //you use to compute the distance dist = distance from party to the point (get_flag(ARRAY_LOCATION,i),get_flag(ARRAY_LOCATION+1,i) //if the newly found distance is smaller than the best known distance, we //will have found a better spawn point than the previously known best if(dist<best_dist){ //if we have found a new best point, record it's distance as the best distance best_dist=dist; //and its index for later use index=i; } i = i + 1;}//point to spawn the monster is now://(get_flag(ARRAY_LOCATION,index),get_flag(ARRAY_LOCATION+1,index))//can now do:place_monster(get_flag(ARRAY_LOCATION,index),get_flag(ARRAY_LOCATION+1,index),MONSTER_TYPE,NOT_WORTH_XP); I hope that's a bit more clear now. Quote Link to comment Share on other sites More sharing options...
Easygoing Eyebeast Thralni Posted August 24, 2008 Author Share Posted August 24, 2008 Thanks Niemand. It's a lot clearer now. I implemented it in the script. Quote Link to comment Share on other sites More sharing options...
Unflappable Drayk Lazarus. Posted August 24, 2008 Share Posted August 24, 2008 Methinks someone is spoiled by his homebrewed averscript interpreter. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.