virtual consoles
[unix-history] / usr / src / games / trek / schedule.c
CommitLineData
bb0cfa24
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
b8401192 7#ifndef lint
bb0cfa24 8static char sccsid[] = "@(#)schedule.c 5.1 (Berkeley) %G%";
b8401192
KM
9#endif not lint
10
11# include "trek.h"
12
13/*
14** SCHEDULE AN EVENT
15**
16** An event of type 'type' is scheduled for time NOW + 'offset'
17** into the first available slot. 'x', 'y', and 'z' are
18** considered the attributes for this event.
19**
20** The address of the slot is returned.
21*/
22
23struct event *schedule(type, offset, x, y, z)
24int type;
06d69904 25double offset;
b8401192
KM
26char x, y;
27char z;
28{
29 register struct event *e;
30 register int i;
06d69904 31 double date;
b8401192
KM
32
33 date = Now.date + offset;
34 for (i = 0; i < MAXEVENTS; i++)
35 {
36 e = &Event[i];
37 if (e->evcode)
38 continue;
39 /* got a slot */
40# ifdef xTRACE
41 if (Trace)
42 printf("schedule: type %d @ %.2f slot %d parm %d %d %d\n",
43 type, date, i, x, y, z);
44# endif
45 e->evcode = type;
46 e->date = date;
47 e->x = x;
48 e->y = y;
49 e->systemname = z;
50 Now.eventptr[type] = e;
51 return (e);
52 }
53 syserr("Cannot schedule event %d parm %d %d %d", type, x, y, z);
54}
55
56
57/*
58** RESCHEDULE AN EVENT
59**
60** The event pointed to by 'e' is rescheduled to the current
61** time plus 'offset'.
62*/
63
64reschedule(e1, offset)
65struct event *e1;
06d69904 66double offset;
b8401192 67{
06d69904 68 double date;
b8401192
KM
69 register struct event *e;
70
71 e = e1;
72
73 date = Now.date + offset;
74 e->date = date;
75# ifdef xTRACE
76 if (Trace)
77 printf("reschedule: type %d parm %d %d %d @ %.2f\n",
78 e->evcode, e->x, e->y, e->systemname, date);
79# endif
80 return;
81}
82
83
84/*
85** UNSCHEDULE AN EVENT
86**
87** The event at slot 'e' is deleted.
88*/
89
90unschedule(e1)
91struct event *e1;
92{
93 register struct event *e;
94
95 e = e1;
96
97# ifdef xTRACE
98 if (Trace)
99 printf("unschedule: type %d @ %.2f parm %d %d %d\n",
100 e->evcode, e->date, e->x, e->y, e->systemname);
101# endif
102 Now.eventptr[e->evcode & E_EVENT] = 0;
103 e->date = 1e50;
104 e->evcode = 0;
105 return;
106}
107
108
109/*
110** Abreviated schedule routine
111**
112** Parameters are the event index and a factor for the time
113** figure.
114*/
115
116struct event *xsched(ev1, factor, x, y, z)
117int ev1;
118int factor;
119int x, y, z;
120{
121 register int ev;
122
123 ev = ev1;
124 return (schedule(ev, -Param.eventdly[ev] * Param.time * log(franf()) / factor, x, y, z));
125}
126
127
128/*
129** Simplified reschedule routine
130**
131** Parameters are the event index, the initial date, and the
132** division factor. Look at the code to see what really happens.
133*/
134
135xresched(e1, ev1, factor)
136struct event *e1;
137int ev1;
138int factor;
139{
140 register int ev;
141 register struct event *e;
142
143 ev = ev1;
144 e = e1;
145 reschedule(e, -Param.eventdly[ev] * Param.time * log(franf()) / factor);
146}