home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 348.lha / chatterbox_v1.0 / sources / rerandom.c < prev    next >
C/C++ Source or Header  |  1990-02-14  |  2KB  |  65 lines

  1. /* sound effect gimmick player - rerandomize routines to do random
  2.  * selection without replacement */
  3.  
  4. #include <exec/types.h>
  5. #include <functions.h>
  6. #include <exec/memory.h>
  7. #include <exec/nodes.h>
  8. #include <exec/lists.h>
  9. #include <stdio.h>
  10. #include <fcntl.h>
  11.  
  12. #include "assert.h"
  13. #include "iff.h"
  14. #include "8svx.h"
  15.  
  16. #include "sample.h"
  17. #include "chatter.h"
  18.  
  19. extern struct gab_info gab_data[N_GAB_TYPES];
  20.  
  21. /* rerandomize randomizes the sample play order for a given gab type
  22.  * It is called by Blather() and by startup code to randomize the
  23.  * list of sample pointers.  By then walking through the list, and
  24.  * rerandomizing every time we finish playing all the samples in the
  25.  * list, we implement random selection without replacement reasonably
  26.  * efficiently.
  27.  *
  28.  * The reason we don't use pure random selection is that it is too
  29.  * annoying to get the same sample a whole bunch of times
  30.  */
  31. rerandomize(gab_type)
  32. int gab_type;
  33. {
  34.     register struct gab_info *gabp;
  35.     register int i, one_to_switch;
  36.     register Sample *samptemp;
  37.  
  38.     gabp = &gab_data[gab_type];
  39.  
  40.     gabp->next_play_gab_item = 0;
  41.  
  42.     for (i = 0; i < gabp->n_gab_items; i++)
  43.     {
  44.         one_to_switch = rando(gabp->n_gab_items);
  45.         if (one_to_switch != i)
  46.         {
  47.             samptemp = gabp->Samples[i];
  48.             assert(samptemp && gabp->Samples[one_to_switch]);
  49.             gabp->Samples[i] = gabp->Samples[one_to_switch];
  50.             gabp->Samples[one_to_switch] = samptemp;
  51.         }
  52.     }
  53. }
  54.  
  55. /* note:  Config() must have been called, and all samples loaded, before
  56.  * calling randomize_all()
  57.  */
  58. randomize_all()
  59. {
  60.     int gab_type;
  61.  
  62.     for (gab_type = 0; gab_type < N_GAB_TYPES; gab_type++)
  63.         rerandomize(gab_type);
  64. }
  65.