diff --git a/source/pad/pads.cpp b/source/pad/pads.cpp index fb06294a6..45fb73e3a 100644 --- a/source/pad/pads.cpp +++ b/source/pad/pads.cpp @@ -67,6 +67,7 @@ sPadData PadData[2]; u8 PadBuffer[2][34]; u8 PadAlign[6]={0,1,0xFF,0xFF,0xFF,0xFF}; u8 PadMotor[2][2]; +int PadRepeatTimers[2][16]; /*****************************************************************************/ // 701 @@ -157,6 +158,9 @@ void PadsInit() PadInitShock(0); PadInitShock(1); + for(int i=0;i<2;i++) + for(int j=0;j<16;j++) + PadRepeatTimers[i][j]=0; } /*****************************************************************************/ @@ -335,6 +339,12 @@ u16 PadGetHeld(int Port) return(PadData[Port].Held); } +/*****************************************************************************/ +u16 PadGetRepeat(int Port) +{ + return(PadData[Port].Repeat); +} + /*****************************************************************************/ void PadClear(int Port) { @@ -345,6 +355,47 @@ void PadClear(int Port) /*****************************************************************************/ +void UpdateRepeats(int _port) +{ + int frames,pad,i,mask,*repeatTimers; + u16 *repeatFlags; + + + frames=GameState::getFramesSinceLast(); + pad=PadGetHeld(_port); + mask=1; + repeatTimers=PadRepeatTimers[_port]; + repeatFlags=&PadData[_port].Repeat; + *repeatFlags=0; + for(i=0;i<16;i++) + { + if(pad&mask) + { + if(*repeatTimers) + { + *repeatTimers-=frames; + if(*repeatTimers<=0) + { + *repeatFlags|=mask; + *repeatTimers=TYPOMATIC_RATE; + } + } + else + { + *repeatFlags|=mask; + *repeatTimers=TYPOMATIC_DELAY; + } + } + else + { + *repeatTimers=0; + } + mask<<=1; + repeatTimers++; + } +} + + void PadUpdate() { PadData[0].Dx= PadData[1].Dx=0; @@ -355,6 +406,8 @@ void PadUpdate() ReadController(0); ReadController(1); + UpdateRepeats(0); + UpdateRepeats(1); } diff --git a/source/pad/pads.h b/source/pad/pads.h index 5913e76e7..a7c4582ec 100644 --- a/source/pad/pads.h +++ b/source/pad/pads.h @@ -40,11 +40,14 @@ #define BUTTON_SELECT PAD_CROSS #define BUTTON_BACK PAD_TRIANGLE +#define TYPOMATIC_DELAY 75 +#define TYPOMATIC_RATE 50 + /*****************************************************************************/ typedef struct { - u16 Up,Held,Down,Old; + u16 Up,Held,Down,Old,Repeat; int XPos, YPos, XPos1, YPos1; // For analog int Dx,Dy, Dx1,Dy1; u8 Status; // These 8 values are obtained @@ -79,7 +82,8 @@ sPadData *PadGet(int Port); u16 PadGetUp(int Port); u16 PadGetDown(int Port); u16 PadGetHeld(int Port); -u16 PadGetTick(int Port); +u16 PadGetRepeat(int Port); + int PadIsDualShock(int Port); diff --git a/source/paul/paul.cpp b/source/paul/paul.cpp index cc8594617..0079275bc 100644 --- a/source/paul/paul.cpp +++ b/source/paul/paul.cpp @@ -161,6 +161,7 @@ int psp=0; void CPaulScene::think(int _frames) { +/* int pad; int sfxId=-1; int setSfxVolume=false; @@ -246,21 +247,18 @@ void CPaulScene::think(int _frames) { PAUL_DBGMSG("speech:%d sfx:%d",mvol,svol); } +*/ - - - -//CXAStream::ControlXA(); - - pad=PadGetHeld(1); - if(pad&PAD_L1) { - } - else + int pad=PadGetRepeat(0); + int i; + for(i=0;i<16;i++) { + if(pad&(1<