JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fixed crashes, autopilot working
[vor.git] / autopilot.c
diff --git a/autopilot.c b/autopilot.c
new file mode 100644 (file)
index 0000000..789aff5
--- /dev/null
@@ -0,0 +1,117 @@
+//  Copyright (C) 2007 Jason Woofenden
+//
+//  This file is part of VoR.
+//
+//  VoR is free software; you can redistribute it and/or modify it
+//  under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2, or (at your option)
+//  any later version.
+//
+//  VoR is distributed in the hope that it will be useful, but
+//  WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with VoR; see the file COPYING.  If not, write to the
+//  Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+//  MA 02111-1307, USA.
+
+
+// This file has code to generate SDL keypress events
+
+#include <stdlib.h>
+#include <SDL.h>
+#include "mt.h"
+
+// SETTINGS
+//
+// auto pilot waits a random amount of time between zero and this many 1/20ths of a second
+#define AUTOPILOT_MAX_DELAY 20.0
+
+#define NUM_KEYS 5
+SDLKey keysyms[NUM_KEYS] = { SDLK_SPACE, SDLK_LEFT, SDLK_RIGHT, SDLK_UP, SDLK_DOWN};
+int states[NUM_KEYS] =     { 0,          0,         0,          0,       0,       };
+
+float next_time;
+float delay;
+
+void
+autopilot_set_timer() {
+       delay = 0;
+       next_time = frnd() * AUTOPILOT_MAX_DELAY;
+}
+
+void
+autopilot_init() {
+       autopilot_set_timer();
+}
+       
+void
+autopilot_fix_keystates(Uint8* table) {
+       int i;
+       for(i = 0; i < NUM_KEYS; ++i) {
+               table[keysyms[i]] = states[i];
+       }
+}
+
+int
+autopilot_num_down() {
+       int i, num;
+       for(num = 0, i = 0; i < NUM_KEYS; ++i) {
+               if(states[i]) {
+                       num++;
+               }
+       }
+
+       return num;
+}
+
+void
+autopilot_send_event() {
+       int down = autopilot_num_down();
+       int nth, i;
+       //SDL_Event event;
+
+       if(down && frnd() < 0.25 + (down / 4.0)) {
+               //event.type = SDL_KEYUP;
+               //event.key.state = 0;
+               nth = (urnd() % down) + 1;
+               for(i = 0; ; ++i) {
+                       if(states[i]) {
+                               --nth;
+                       }
+                       if(nth == 0) {
+                               //event.key.keysym.sym = keysyms[i];
+                               states[i] = 0;
+                               break;
+                       }
+               }
+       } else {
+               //event.type = SDL_KEYDOWN;
+               //event.key.state = 1;
+               nth = (urnd() % (NUM_KEYS - down)) + 1;
+               for(i = 0; ; ++i) {
+                       if(!states[i]) {
+                               --nth;
+                       }
+                       if(nth == 0) {
+                               //event.key.keysym.sym = keysyms[i];
+                               states[i] = 1;
+                               break;
+                       }
+               }
+       }
+
+       //fprintf(stderr, "push event: %i %i\n", event.key.keysym.sym, event.type);
+       //SDL_PushEvent(&event);
+}
+
+void
+autopilot(float ticks) {
+       delay += ticks;
+       if(delay > next_time) {
+               autopilot_set_timer();
+               autopilot_send_event();
+       }
+}