This file is indexed.

/usr/share/games/angrydd/events.py is in angrydd 1.0.1-10.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# events.py -- event handling wrapper
# Copyright 2004 Joe Wreschnig <piman@sacredchao.net>
# Released under the terms of the GNU GPL v2.
__revision__ = "$Id: events.py 317 2006-01-12 21:19:27Z piman $"

from constants import *
from pygame import event, key, joystick, time, display
from pygame.event import Event

from util import Singleton

# Key repeat delay and repeat rate and joystick tolerance.
DELAY, RATE = 200, 75
TOLERANCE = 0.95

import config

CONFIRM_BUTTON = config.getint("buttons", "start")
PAUSE_BUTTON = config.getint("buttons", "pause")

# Alias post, so pygame.event is unnecessary outside this module.
post = event.post

class EventManager(Singleton):
    def __init__(self):
        if hasattr(EventManager, "_singleton"): return
        key.set_repeat(DELAY, RATE)
        event.set_allowed(None)
        event.set_allowed([KEYDOWN, JOYBUTTONDOWN, JOYAXISMOTION,
                           JOYBUTTONUP, PLAYER])

        for i in range(joystick.get_count()):
            joystick.Joystick(i).init()

        # Information for joystick repeat.
        self._last_press = [None, None]
        self._last_press_start = [0, 0]
        self._last_press_times = [0, 0]

        # Maps key values to player numbers.
        self.players = { K_w: 0, K_a: 0, K_s: 0, K_d: 0, K_q: 0, K_e: 0,
                         K_i: 1, K_j: 1, K_k: 1, K_l: 1, K_u: 1, K_o: 1,
                         K_LEFT: 0, K_RIGHT: 0, K_UP: 0, K_DOWN: 0,
                         K_SPACE: 0, K_KP_ENTER: 0, K_RETURN: 0, K_2: 1,
                         K_1: 0, K_BACKSPACE: 1 }

        # Maps key values to internal event keys.
        self.events = { K_w: UP, K_a: LEFT, K_s: DOWN, K_d: RIGHT,
                        K_q: ROT_CC, K_e: ROT_CW,
                        K_i: UP, K_j: LEFT, K_k: DOWN, K_l: RIGHT,
                        K_u: ROT_CC, K_o: ROT_CW,
                        K_LEFT: LEFT, K_RIGHT: RIGHT, K_UP: UP, K_DOWN: DOWN,
                        K_SPACE: ROT_CC, K_KP_ENTER: CONFIRM,
                        K_RETURN: CONFIRM, K_2: CONFIRM,
                        K_BACKSPACE: CONFIRM, K_1: CONFIRM }

        Singleton.__init__(self)

    def clear(self):
        self._last_press = [None, None]
        self._last_press_start = [0, 0]
        self._last_press_times = [0, 0]
        event.clear()

    # This isn't a very good "wait" function.
    def wait(self):
        while not event.peek([KEYDOWN, JOYBUTTONDOWN, JOYAXISMOTION,
                              JOYBUTTONUP, QUIT]):
            time.wait(10)
        return self.get()

    # Get all events in the Pygame event queue and translate them
    # to PLAYER events.
    def get(self):
        t = time.get_ticks()
        events = []
        for ev in event.get(KEYDOWN):
            try:
                events.append(Event(PLAYER,
                                    key = self.events[ev.key],
                                    player = self.players[ev.key]))
            except KeyError:
                if ev.key == K_F11 or ev.key == K_f:
                    display.toggle_fullscreen()
                elif ev.key == K_p:
                    events.append(Event(PAUSE))
                elif ev.key == K_ESCAPE:
                    events.append(Event(QUIT))

        # Joysticks are translated to either 0 or 1, and any button
        # below 4 is also translated to 0 or 1. Thus, e.g. button 3
        # on js 1 and button 1 on js 3 will generate the same event.

        # Button numbers over 15 swap the joystick value and have
        # 16 subtracted from them. This makes the EMSUSB2 adapter work
        # in Linux (where it appears as a single 32 button joystick,
        # rather than two 16 button ones).

        # Button patterns testing on Playstation controllers and also
        # a Gravis gamepad.
        for ev in event.get(JOYBUTTONDOWN):
            if ev.button > 15: button, joy = ev.button - 16, ev.joy + 1
            else: button, joy = ev.button, ev.joy
            player = joy % 2
            if button == CONFIRM_BUTTON:
                events.append(Event(PLAYER, key = CONFIRM, player = player))
            elif button == PAUSE_BUTTON:
                events.append(Event(PAUSE))
            elif button < 4:
                if button & 1: key = ROT_CW
                else: key = ROT_CC
                self._last_press[player] = key
                self._last_press_start[player] = t
                events.append(Event(PLAYER, key = key, player = player))

        for ev in event.get(JOYBUTTONUP):
            if ev.button > 15: button, joy = ev.button - 16, ev.joy + 1
            else: button, joy = ev.button, ev.joy
            player = joy % 2
            if button < 4:
                if button & 1: key = ROT_CW
                else: key = ROT_CC
                if self._last_press[player] == key:
                    self._last_press[player] = None

        # Axis stuff; again for the EMSUSB2 axes 3 and 4 are actually on
        # the second joystick.
        for ev in event.get(JOYAXISMOTION):
            if ev.axis == 3: axis, joy = 0, ev.joy + 1
            elif ev.axis == 4: axis, joy = 1, ev.joy + 1
            else: axis, joy = ev.axis, ev.joy
            player = joy % 2
            key = None
            if axis == 0:
                if ev.value < -TOLERANCE: key = LEFT
                elif ev.value > TOLERANCE: key = RIGHT
            elif axis == 1:
                if ev.value > TOLERANCE: key = DOWN
                elif ev.value < -TOLERANCE: key = UP

            if key is not None and self._last_press[player] != key:
                self._last_press[player] = key
                self._last_press_start[player] = t
                events.append(Event(PLAYER, key = key, player = player))
            elif key is None and axis <= 1:
                self._last_press[player] = None

        # Check for repeated events -- if any player has a pending
        # repeat event that hasn't fired in the given interval put it
        # on the queue again.
        for player in range(len(self._last_press)):
            if (self._last_press[player] is not None and
                (t - self._last_press_start[player]) > DELAY and
                (t - self._last_press_times[player]) > RATE):
                self._last_press_times[player] = t
                events.append(Event(PLAYER, key = self._last_press[player],
                                    player = player))

        # Don't actually post events here; the loop that gets them
        # knows what to do. However, if PLAYER events are posted, grab them
        # and use them.
        events.extend(event.get([PLAYER, QUIT]))
        return events