walk_master.c-Dateireferenz

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define MAX_DELAYTIME   90
#define DEFAULT_WALK_DELAY   180
#define MAX_JOB_COST   200000
#define TIME(t)   (t & 0x00ff)
#define RANDOM(r)   ((r & 0xff00) >> 8)
#define WERT(t, r)   ((t & 0x00ff)+((r << 8) & 0xff00))
#define ERROR(x)   raise_error(sprintf(x, previous_object()));

Funktionen

void create ()
varargs void RegisterWalker (int time, int rand, closure walk_closure)
int dummy_walk ()
void RemoveWalker ()
int Registration ()
void heart_beat ()
void reset ()
mixed * WalkerList ()

Variablen

static int counter
static int num_walker
static mixed * walker

Makro-Dokumentation

#define DEFAULT_WALK_DELAY   180

Definiert in Zeile 22 der Datei walk_master.c.

Wird benutzt von RegisterWalker().

#define ERROR ( x   )     raise_error(sprintf(x, previous_object()));

Definiert in Zeile 46 der Datei walk_master.c.

#define MAX_DELAYTIME   90

Definiert in Zeile 21 der Datei walk_master.c.

Wird benutzt von heart_beat(), RegisterWalker(), Registration() und reset().

#define MAX_JOB_COST   200000

Definiert in Zeile 23 der Datei walk_master.c.

Wird benutzt von heart_beat().

#define RANDOM (  )     ((r & 0xff00) >> 8)

Definiert in Zeile 28 der Datei walk_master.c.

Wird benutzt von heart_beat().

#define TIME (  )     (t & 0x00ff)

Definiert in Zeile 27 der Datei walk_master.c.

#define WERT ( t,
 )     ((t & 0x00ff)+((r << 8) & 0xff00))

Definiert in Zeile 29 der Datei walk_master.c.

Wird benutzt von RegisterWalker().


Dokumentation der Funktionen

void create (  ) 

Definiert in Zeile 35 der Datei walk_master.c.

Benutzt destruct(), num_walker und walker.

00036 {
00037   if (clonep(this_object())) {
00038     destruct(this_object());
00039     raise_error("walk_master can't be clonend.\n");
00040   }
00041   walker=({});
00042   num_walker=0;
00043   enable_commands(); // ohne das, kein heart_beat()
00044 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int dummy_walk (  ) 

Definiert in Zeile 83 der Datei walk_master.c.

00084 {   return 0;  }

void heart_beat (  ) 

Definiert in Zeile 123 der Datei walk_master.c.

Benutzt counter, i, MAX_DELAYTIME, MAX_JOB_COST, num_walker, RANDOM, TIME und walker.

00124 {
00125    int i;
00126    if (num_walker && i=sizeof(walker[counter])) {
00127      int tmp;
00128      num_walker-=i;
00129      for (i--;i>=0;i--) {
00130        if (get_eval_cost() < MAX_JOB_COST) {
00131          // nicht abgefertigte NPCs im naechsten heart_beat ausfuehren
00132          walker[counter]=walker[counter][0..i];
00133          num_walker+=i+1;
00134          return;
00135        }
00136        else {
00137          if (walker[counter][i][1] &&
00138              !catch(tmp=(int)funcall(walker[counter][i][1])) && tmp) {
00139            tmp=counter+(TIME(walker[counter][i][0])
00140               +random(RANDOM(walker[counter][i][0])))/2;
00141            if (tmp>MAX_DELAYTIME) tmp-=MAX_DELAYTIME;
00142            walker[tmp]+=({ walker[counter][i] });
00143            num_walker++;
00144          }
00145        }
00146      }
00147      walker[counter]=({}); // komplett leeren
00148    }
00149    if (counter == MAX_DELAYTIME)
00150      counter=0;
00151    else counter++;
00152    if (!num_walker) {
00153      set_heart_beat(0);
00154      walker=({}); // Speicher freigeben...
00155    }
00156 }

varargs void RegisterWalker ( int  time,
int  rand,
closure  walk_closure 
)

Definiert in Zeile 51 der Datei walk_master.c.

Benutzt DEFAULT_WALK_DELAY, ERROR, MAX_DELAYTIME, num_walker, walker und WERT.

00052 {
00053   int wert, next;
00054   closure func;
00055   
00056   // pruefen ob die Paramter zulaessig sind...
00057   if (time<0) ERROR("negative time to RegisterWalker() from %O.\n");
00058   if (rand<0) ERROR("negative random to RegisterWalker() from %O.\n");
00059   if ((time+rand) > (2*MAX_DELAYTIME)) 
00060     ERROR("Too long delaytime from %s to RegisterWalker().\n");
00061 
00062   wert=WERT(time, rand);
00063   if (!wert && !rand) wert=DEFAULT_WALK_DELAY;
00064   if (walk_closure)
00065     func=walk_closure;
00066   else {
00067     func=symbol_function("Walk", previous_object());
00068     if (!func)
00069       raise_error("RegisterWalker() call from Object without Walk() function.\n");
00070   }
00071   if (!num_walker) {
00072     set_heart_beat(1);
00073     if (!pointerp(walker) || !sizeof(walker))
00074       walker=map(allocate(MAX_DELAYTIME+1), #'allocate);
00075   }
00076   next=counter;
00077   next+=(time+random(rand))/2;
00078   if (next>MAX_DELAYTIME) next-=MAX_DELAYTIME;
00079   walker[next]+=({ ({ wert, func }) });
00080   num_walker++;
00081 }

int Registration (  ) 

Definiert in Zeile 111 der Datei walk_master.c.

Benutzt i, MAX_DELAYTIME, num_walker, query_closure_object() und walker.

00112 {
00113   int i, j, reg;
00114   if (!num_walker) return 0;
00115   reg=0;
00116   for (i=MAX_DELAYTIME; i>=0; i--) {
00117     for (j=sizeof(walker[i])-1; j>=0; j--)
00118       if (query_closure_object(walker[i][j])==previous_object()) reg++;
00119   }
00120   return reg;
00121 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void RemoveWalker (  ) 

Definiert in Zeile 89 der Datei walk_master.c.

00090 {
00091   int i, j;
00092   if (!num_walker) return;
00093   for (i=MAX_DELAYTIME; i>=0; i--) {
00094     for (j=sizeof(walker[i])-1; j>=0; j--) {
00095       if (query_closure_object(walker[i][j])==previous_object()) {
00096         if (i==counter) // koennte gerade im heart_beat stecken...
00097           walker[i][j]=({ 0, #'dummy_walk });
00098         else walker[i][j]=0;
00099         num_walker--;
00100       }
00101     }
00102     if (i!=counter) // koennte gerade im heart_beat stecken...
00103       walker[i]-=({ 0 });
00104   }
00105 }

void reset ( void   ) 

Definiert in Zeile 158 der Datei walk_master.c.

Benutzt dtime(), i, MAX_DELAYTIME, num_walker und walker.

00161 {
00162   if (set_heart_beat(0)<=0) {
00163     int i;
00164     num_walker=0; // neu berechnen...
00165     if (!sizeof(walker)) return;
00166     for (i=MAX_DELAYTIME; i>=0; i--)
00167       num_walker+=sizeof(walker[i]);
00168     if (num_walker>0) {
00169        write_file(object_name()+".err", sprintf(
00170          "%s: Fehler im heart_beat(). %d aktive Prozesse.\n",
00171           dtime(time()), num_walker));
00172        enable_commands();
00173        set_heart_beat(1);
00174     }
00175   }
00176   else set_heart_beat(1);
00177 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

mixed* WalkerList (  ) 

Definiert in Zeile 179 der Datei walk_master.c.

Benutzt counter, num_walker und walker.

00180 {  return ({ num_walker, walker, counter });  }


Variablen-Dokumentation

int counter [static]

Definiert in Zeile 31 der Datei walk_master.c.

int num_walker [static]

Definiert in Zeile 32 der Datei walk_master.c.

Wird benutzt von create(), heart_beat(), RegisterWalker(), Registration(), reset() und WalkerList().

mixed* walker [static]

Definiert in Zeile 33 der Datei walk_master.c.

Wird benutzt von create(), heart_beat(), RegisterWalker(), Registration(), reset() und WalkerList().

Erzeugt am Thu Jun 3 14:40:58 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3