def _run_command(spline, new_robot, new_bullets): command, args = spline[0], spline[1:] new_bullet = None if command == "set-speed": new_robot.speed = float(args[0]) consumed = 2 elif command == "set-rotation-speed": new_robot.rotation = float(args[0]) consumed = 2 elif command == "set-turret-rotation-speed": new_robot.turret_rotation = float(args[0]) consumed = 2 elif command == "fire": new_bullet = battlefield.fire_bullet(new_robot, field) new_bullets.append(new_bullet) consumed = 1 elif command == "rotate-turret-to-angle-and-fire": if new_robot.time_to_fire: if new_robot.turret_final_angle is None: new_robot.turret_final_angle = float(args[0]) elif new_robot.fire_angle is None: new_robot.fire_angle = float(args[0]) consumed = 2 elif command == "rotate-turret-to-angle": if new_robot.turret_final_angle is None: new_robot.turret_final_angle = float(args[0]) consumed = 2 else: raise ValueError, "unknown command: %s" % command return consumed, new_robot, new_bullets
def input_callback(loop_id, field, new_robot, controls, first): """Process input keyboard events to move and rotate the robot.""" # Use the same global events variables for all callbacks for a given loop. global loop_events #assert events is not None or first, "First callback must get events""" if loop_id not in loop_events: # Only the first callback on the loop has to get the events events = pygame.event.get() loop_events[loop_id] = events else: events = loop_events[loop_id] if not process_default_events(events): raise battlefield.AbortBattle new_bullet = None changed = False for event in events: if event.type == pygame.KEYDOWN: if event.key == controls.fire: new_bullet = battlefield.fire_bullet(new_robot, field) changed = True def sign(x): return cmp(x, 0.0) or 1.0 pressed = pygame.key.get_pressed() new_speed = new_rotation = new_turret_rotation = 0.0 if pressed[controls.forward]: new_speed += 150 if pressed[controls.backward]: new_speed += -100 if pressed[controls.rotate_right]: new_rotation += -100*sign(new_speed) if pressed[controls.rotate_left]: new_rotation += 100*sign(new_speed) if pressed[controls.turret_rotate_left]: new_turret_rotation += 100 if pressed[controls.turret_rotate_right]: new_turret_rotation += -100 for attr, value in [("speed", new_speed), ("rotation", new_rotation), ("turret_rotation", new_turret_rotation)]: if getattr(new_robot, attr) != value: setattr(new_robot, attr, value) changed = True if changed: return [battlefield.StateChange(update_robots=[new_robot], new_bullets=lib.compact([new_bullet]))]