Ticket #3971: drascula_keybuffer.patch

File drascula_keybuffer.patch, 3.6 KB (added by wjp, 11 years ago)
  • engines/drascula/drascula.cpp

     
    6666                _system->openCD(cd_num);
    6767
    6868        _lang = kEnglish;
     69
     70        _keyBufferHead = _keyBufferTail = 0;
    6971}
    7072
    7173DrasculaEngine::~DrasculaEngine() {
     
    701703
    702704Common::KeyCode DrasculaEngine::getScan() {
    703705        updateEvents();
     706        if (_keyBufferHead == _keyBufferTail) return Common::KEYCODE_INVALID;
    704707
    705         return _keyPressed.keycode;
     708        Common::KeyCode key = _keyBuffer[_keyBufferTail].keycode;
     709        _keyBufferTail = (_keyBufferTail + 1) % KEYBUFSIZE;
     710
     711        return key;
    706712}
    707713
     714void DrasculaEngine::addKeyToBuffer(Common::KeyState& key) {
     715        if ((_keyBufferHead + 1) % KEYBUFSIZE == _keyBufferTail) {
     716                warning("key buffer overflow");
     717                return;
     718        }
     719
     720        _keyBuffer[_keyBufferHead] = key;
     721        _keyBufferHead = (_keyBufferHead + 1) % KEYBUFSIZE;
     722}
     723
     724void DrasculaEngine::flushKeyBuffer() {
     725        updateEvents();
     726        _keyBufferHead = _keyBufferTail = 0;
     727}
     728
    708729void DrasculaEngine::updateEvents() {
    709730        Common::Event event;
    710731        Common::EventManager *eventMan = _system->getEventManager();
     
    718739#endif
    719740                switch (event.type) {
    720741                case Common::EVENT_KEYDOWN:
    721                         _keyPressed = event.kbd;
     742                        addKeyToBuffer(event.kbd);
    722743                        break;
    723744                case Common::EVENT_KEYUP:
    724                         _keyPressed.keycode = Common::KEYCODE_INVALID;
    725745                        break;
    726746                case Common::EVENT_MOUSEMOVE:
    727747                        mouseX = event.mouse.x;
  • engines/drascula/interface.cpp

     
    146146}
    147147
    148148void DrasculaEngine::enterName() {
    149         Common::KeyCode key, prevkey = Common::KEYCODE_INVALID;
     149        Common::KeyCode key;
     150        flushKeyBuffer();
    150151        int counter = 0;
    151152        int v = 0, h = 0;
    152153        char select2[23];
     
    156157                copyBackground(115, 14, 115, 14, 176, 9, bgSurface, screenSurface);
    157158                print_abc(select2, 117, 15);
    158159                updateScreen();
    159                 _system->delayMillis(100);
    160160
    161161                key = getScan();
    162162
    163                 // Artifically decrease repeat rate.
    164                 // Part of bug fix#2017432 DRASCULA: Typing is slow when you save a game
    165                 // Alternative is to roll our own event loop
    166                 if (key == prevkey)
    167                         if (++counter == 3) {
    168                                 counter = 0;
    169                                 prevkey = Common::KEYCODE_INVALID;
    170                         }
    171 
    172                 if (key != 0 && key != prevkey) {
    173                         prevkey = key;
     163                if (key != 0) {
    174164                        if (key >= 0 && key <= 0xFF && isalpha(key))
    175165                                select2[v] = tolower(key);
    176166                        else if ((key >= Common::KEYCODE_0 && key <= Common::KEYCODE_9) || key == Common::KEYCODE_SPACE)
  • engines/drascula/drascula.h

     
    268268#define COMPLETE_PAL    256
    269269#define HALF_PAL                128
    270270
     271#define KEYBUFSIZE              16
     272
    271273static const int interf_x[] ={ 1, 65, 129, 193, 1, 65, 129 };
    272274static const int interf_y[] ={ 51, 51, 51, 51, 83, 83, 83 };
    273275
    274276class DrasculaEngine : public ::Engine {
    275         Common::KeyState _keyPressed;
    276 
    277277protected:
    278278        int init();
    279279        int go();
     
    426426        int leftMouseButton;
    427427        int rightMouseButton;
    428428
     429        Common::KeyState _keyBuffer[KEYBUFSIZE];
     430        int _keyBufferHead;
     431        int _keyBufferTail;
     432
    429433        bool loadDrasculaDat();
    430434
    431435        bool runCurrentChapter();
     
    448452        bool verify1();
    449453        bool verify2();
    450454        Common::KeyCode getScan();
     455        void addKeyToBuffer(Common::KeyState& key);
     456        void flushKeyBuffer();
    451457        void selectVerb(int);
    452458        void updateVolume(Audio::Mixer::SoundType soundType, int prevVolume);
    453459        void volumeControls();