+badge_sprite const *jumpnrun_hacker_symbol(void) {
+ return &anim_hacker[0];
+}
+
+static badge_sprite const anim_sickle[] = {
+ { 3, 3, (uint8_t const *) "\xab\x01" },
+ { 3, 3, (uint8_t const *) "\xee\x00" }
+/*
+ { 3, 3, (uint8_t const *) "\x8a\x01" },
+ { 3, 3, (uint8_t const *) "\x6a" },
+ { 3, 3, (uint8_t const *) "\xa3" },
+ { 3, 3, (uint8_t const *) "\xac" }
+*/
+};
+
+enum {
+ JUMPNRUN_SHOT_EXTENT = 3,
+ JUMPNRUN_SHOT_TICKS_PER_FRAME = 36
+};
+
+static void jumpnrun_shot_spawn(jumpnrun_shot *shot, jumpnrun_game_state const *state) {
+ shot->tick = 0;
+ shot->inertia = shot_spawn_inertia;
+
+ if(state->player.anim_direction == BADGE_BLT_MIRRORED) {
+ shot->current_box = rectangle_new((vec2d) { fixed_point_sub(rectangle_left(&state->player.current_box), FIXED_INT(JUMPNRUN_SHOT_EXTENT)), rectangle_top(&state->player.current_box) },
+ (vec2d) { FIXED_INT(JUMPNRUN_SHOT_EXTENT), FIXED_INT(JUMPNRUN_SHOT_EXTENT) });
+ shot->inertia.x = fixed_point_neg(shot->inertia.x);
+ } else {
+ shot->current_box = rectangle_new((vec2d) { rectangle_right(&state->player.current_box), rectangle_top(&state->player.current_box) },
+ (vec2d) { FIXED_INT(JUMPNRUN_SHOT_EXTENT), FIXED_INT(JUMPNRUN_SHOT_EXTENT) });
+ }
+
+ shot->old_box = shot->current_box;
+ shot->inertia = vec2d_add(shot->inertia, state->player.inertia);
+}