trac ticket #1

Erik Auerswald auerswal at unix-ag.uni-kl.de
Sat Sep 3 11:27:13 EDT 2005


Hi,

I think I finally understood what is ask for in the ticket... since I
havn't found out how to change/annotate the ticket in the wiki I write a
mail.

Attached to the mail are 2 patches:

The first implements an obj_alarm() function the same way as
sprite_alarm(), but in engine/schedule.[hc].

The second patch uses this function to enforce a re-generation limit in
the singleton generator. The second patch is only included as a test
case for the otherwise unused obj_alarm() function and includes some
debugging output (the changes in the level 1 settings file are for
debugging purposes only). I don't think this patch is ready to apply to
svn.

Both patches use the delay_to_frames() function of my previous
timing-step1 patch.

If this really implements the request from the ticket I can apply patch 1
to svn (after the timing patch of course (at least the delay_to_frames()
function)).

Erik
-------------- next part --------------
diff -uNrB timing-step1/src/engine/schedule.c object_alarm/src/engine/schedule.c
--- timing-step1/src/engine/schedule.c	2005-09-02 20:54:53.000000000 +0200
+++ object_alarm/src/engine/schedule.c	2005-09-03 14:32:02.000000000 +0200
@@ -101,3 +101,13 @@
       return 0;
     }
 }
+
+static void send_obj_alarm(msg_t msg, void *obj)
+{
+  obj_message(obj, msg);
+}
+
+void obj_alarm(unsigned int delay, void *obj,  msg_t msg)
+{
+  schedule(delay_to_frames(delay), SCHED_NORMAL, send_obj_alarm, msg, obj);
+}
diff -uNrB timing-step1/src/engine/schedule.h object_alarm/src/engine/schedule.h
--- timing-step1/src/engine/schedule.h	2005-09-02 20:58:43.000000000 +0200
+++ object_alarm/src/engine/schedule.h	2005-09-03 14:31:27.000000000 +0200
@@ -27,5 +27,7 @@
 {
   return (delay * FRAMERATE) / 10;
 }
+/* send a message to the object after a delay (in 100ms) */
+void obj_alarm(unsigned int delay, void *obj,  msg_t msg);
 
 #endif
-------------- next part --------------
diff -uNrB object_alarm/share/levels/1/settings generator_poc/share/levels/1/settings
--- object_alarm/share/levels/1/settings	2005-08-19 22:24:02.000000000 +0200
+++ generator_poc/share/levels/1/settings	2005-09-03 15:09:33.000000000 +0200
@@ -11,15 +11,15 @@
 generator multi bird 400 300 3 rx=240 ry=120 vx=2 vy=2 timeout=30
 
 # ...and two clouds
-generator singleton cloud 80 250 99 vx=0.5 ry=150 timeout=50
-generator singleton cloud 720 250 99 vx=-0.5 ry=150 timeout=70
+generator singleton cloud 80 250 99 vx=0.5 ry=150 timeout=50 objtag=cloud1
+generator singleton cloud 720 250 99 vx=-0.5 ry=150 timeout=70 objtag=cloud2
 
 # players: sprite x y lives [keys]
 generator player biplane 100 500 3 objtag=p1plane
 generator player biplane 700 500 3 objtag=p2plane
 
 # infinitely fuel at 5 sec intervals (after previous barrel taken)
-generator singleton fuel 400 520 0 timeout=50
+generator singleton fuel 400 520 0 timeout=50 objtag=fuel
 
 # level ends when 5 birds are killed
 trigger level-done spritekill bird 5 "msg=Five birds killed!"
diff -uNrB object_alarm/src/engine/generator.c generator_poc/src/engine/generator.c
--- object_alarm/src/engine/generator.c	2005-08-19 22:31:03.000000000 +0200
+++ generator_poc/src/engine/generator.c	2005-09-03 15:06:20.000000000 +0200
@@ -21,7 +21,8 @@
 /* generator bitflags */
 enum {
 	GENERATOR_ACTIVE = 1,
-	GENERATOR_COUNTED = 2
+	GENERATOR_COUNTED = 2,
+	GENERATOR_SCHEDULED = 4
 };
 #define	GENERATOR_ACTIVATE(g)	((g)->flags |= GENERATOR_ACTIVE)
 #define	GENERATOR_DEACTIVATE(g)	((g)->flags &= ~GENERATOR_ACTIVE)
@@ -31,6 +32,10 @@
 #define	GENERATOR_UNLIMIT_COUNT(g)	((g)->flags &= ~GENERATOR_COUNTED)
 #define	GENERATOR_IS_COUNT_LIMITED(g)	((g)->flags & GENERATOR_COUNTED)
 
+#define GENERATOR_SCHEDULE(g)		((g)->flags |= GENERATOR_SCHEDULED)
+#define GENERATOR_IS_SCHEDULED(g)	((g)->flags & GENERATOR_SCHEDULED)
+#define GENERATOR_CLEAR_SCHEDULE(g)	((g)->flags &= ~GENERATOR_SCHEDULED)
+
 /* ------------- generator type ------------------ */
 
 typedef struct generator {
@@ -250,6 +255,15 @@
 			obj_unlock(old);
 			break;
 		}
+		/* generate sprite after delay */
+		if(!GENERATOR_IS_SCHEDULED(g)) {
+printf("frame %u: scheduling generation of %s to %u\n", frame_nr(), g->tag, frame_nr() + delay_to_frames(g->timeout));
+		  obj_alarm(g->timeout, obj, msg_generate());
+		  GENERATOR_SCHEDULE(g);
+		}
+		break;
+	case MSG_GENERATE:
+printf("frame %u: got MSG_GENERATE for %s\n", frame_nr(), g->tag);
 		/* create new sprite... */
 		if (!(s = create_generator_sprite(g))) {
 			break;
@@ -268,6 +282,7 @@
 			/* generator has finished */
 			GENERATOR_DEACTIVATE(g);
 		}
+		GENERATOR_CLEAR_SCHEDULE(g);
 		break;
 	default:
 		return MSG_RET_UNKNOWN;
diff -uNrB object_alarm/src/engine/msg_types.h generator_poc/src/engine/msg_types.h
--- object_alarm/src/engine/msg_types.h	2005-08-19 22:31:03.000000000 +0200
+++ generator_poc/src/engine/msg_types.h	2005-09-03 14:41:44.000000000 +0200
@@ -54,6 +54,9 @@
     MSG_BGSTUCK,
     MSG_OUTOFBOUNDS,
 
+    /* tell a generator to generate a sprite */
+    MSG_GENERATE,
+
     MSG_ENDOFTYPES /* Must be the last message type! */
   };
 
@@ -209,4 +212,10 @@
   return m;
 }
 
+static INLINE msg_t msg_generate(void)
+{
+  msg_t m = {MSG_GENERATE};
+  return m;
+}
+
 #endif


More information about the airstrike mailing list