shiny-cuty-excel-chiffon/data/KeyInput.tjs
2024-10-22 11:38:49 -05:00

670 lines
32 KiB
Text


class KeyState
{
var enter;
var done;
var tick;
var key;
var owner;
function KeyState(owner, key)
{
this.owner = owner;
enter = false;
done = false;
tick = 0;
}
function clear()
{
enter = false;
}
function set(s, exp)
{
if(s){
enter = s * (!done);
if(exp !== void) Scripts.eval(exp,,, owner);
}else{
done = false;
}
}
}
class KeyInput
{
var owner;
// 入力方向
var pDirection = 0;
// コマンド処理用入力履歴
var history = [];
// コマンド判定結果
var command = [];
var commandNum;
// 左右どちらを最後に入力したか
var lastInputLeftRight = 0;
// 左を入力している(左上、左下を含む)
var inputLeft = false;
// 右を入力している(右上、右下を含む)
var inputRight = false;
// 攻撃ボタン長押し中
var inputAttackTick = 0;
var state = %[];
var user;
function KeyInput(owner, u=0){
this.owner = owner;
user = u;
state[keySpecial] = new KeyState(this, keySpecial);
state[keyEscAttack] = new KeyState(this, keyEscAttack);
state[keyAttack] = new KeyState(this, keyAttack);
state[keyJump] = new KeyState(this, keyJump);
state[keyDash] = new KeyState(this, keyDash);
state[keySwitch] = new KeyState(this, keySwitch);
state[keyLeaveIt] = new KeyState(this, keyLeaveIt);
}
// function existInput(){
function isExist(){
var i = 0;
i = i | state[keySpecial].enter;
i = i | state[keyEscAttack].enter;
i = i | state[keyAttack].enter;
i = i | state[keyJump].enter;
i = i | state[keyDash].enter;
i = i | state[keySwitch].enter;
i = i | state[keyLeaveIt].enter;
i = i | (direction!=0);
//dm("user : " + user + " / " + state[keySpecial].enter + ", " +state[keyEscAttack].enter + ", " +state[keyAttack].enter + ", " +state[keyJump].enter + ", " +state[keyDash].enter + " / direction : " + direction);
return i;
}
// function clearInput()
function clear()
{
state[keySpecial].clear();
state[keyEscAttack].clear();
state[keyAttack].clear();
state[keyJump].clear();
state[keyDash].clear();
state[keySwitch].clear();
state[keyLeaveIt].clear();
direction = 0;
command.clear();
// lastInputLeftRight = 0;
}
function done(k)
{
state[k].clear();
state[k].done = true;
state[k].tick = owner.tickCount;
}
function getInputDirection()
{
var Up = 0;
var Right = 0;
var Down = 0;
var Left = 0;
var UpRight = 0;
var DownRight = 0;
var DownLeft = 0;
var UpLeft = 0;
if(owner.windowActive){
var mode = (user==0 && ( sf.pad1InputForChara1 || ( bao.players.count>0 && bao.players[0].chara==chrChocolat)));
// 上
for(var i=0; i<sf.keyUp[user].count; i++){
Up = Up || getKeyState(sf.keyUp[user][i]);
}
// 右
for(var i=0; i<sf.keyRight[user].count; i++){
Right = Right || getKeyState(sf.keyRight[user][i]);
}
if(!mode){
Right = Right || getKeyState(sf.keyNext[user][(user==0&&sf.pad1InputForChara1)?1:0]);
}else{
Right = Right || getKeyState(sf.keyNext[user][(user==0)?1:0]);
}
// 下
for(var i=0; i<sf.keyDown[user].count; i++){
Down = Down || getKeyState(sf.keyDown[user][i]);
}
// 左
for(var i=0; i<sf.keyLeft[user].count; i++){
Left = Left || getKeyState(sf.keyLeft[user][i]);
}
if(!mode){
Left = Left || getKeyState(sf.keyPrev[user][(user==0&&sf.pad1InputForChara1)?1:0]);
}else{
Left = Left || getKeyState(sf.keyPrev[user][(user==0)?1:0]);
}
// 右上
for(var i=0; i<sf.keyUpRight[user].count; i++){
UpRight = UpRight || getKeyState(sf.keyUpRight[user][i]);
}
// 右下
for(var i=0; i<sf.keyDownRight[user].count; i++){
DownRight = DownRight || getKeyState(sf.keyDownRight[user][i]);
}
// 左下
for(var i=0; i<sf.keyDownLeft[user].count; i++){
DownLeft = DownLeft || getKeyState(sf.keyDownLeft[user][i]);
}
// 左上
for(var i=0; i<sf.keyUpLeft[user].count; i++){
UpLeft = UpLeft || getKeyState(sf.keyUpLeft[user][i]);
}
if(UpRight){
Up = true;
Right = true;
}
if(DownRight){
Down = true;
Right = true;
}
if(DownLeft){
Down = true;
Left = true;
}
if(UpLeft){
Up = true;
Left = true;
}
}
if(Up || Down || Left || Right) kag.hideMouseCursor();
// // マウスによる入力
// if(user == 0){
// if(timer.enabled && getKeyState(VK_LBUTTON)){
// var x = int(dispLayer1.cursorX / zoomRate);
// var y = int(dispLayer1.cursorY / zoomRate);
// if(!dcLayer.visible){
// mx = x;
// my = y;
// dcLayer.show(mx, my);
// }else{
// var dx = x - mx;
// var dy = y - my;
// if(dx*dx+dy*dy>16){
// if(dx != 0){
// var at = Math.atan(dy / Math.abs(dx));
// var p8 = Math.PI / 8;
//
// if(at < -p8) Up = true;
// if(at > p8) Down = true;
//
// if((at<0 && at>-p8*3)||(at>0 && at<p8*3)){
// if(dx > 0) Right = true;
// if(dx < 0) Left = true;
// }
// }else{
// Up = (dy < 0);
// Down = (dy > 0);
// }
// }
// }
// mButtonDownTick = tickCount;
// }else{
// if(tickCount - mButtonDownTick > 8){
// dcLayer.hide();
// mButtonDownTick = 0;
// }
// }
// }
// if(Up){
// Like10key = 8 - (Left) + (Right);
// }else if(Down){
// Like10key = 2 - (Left) + (Right);
// }else{
// Like10key = 5 - (Left) + (Right);
// }
//
//// if(user == 0){
//// owner.dcLayer.draw(Like10key-1);
//// }
//
// if(Left){
// lastInputLeftRight = -1;
// }else if(Right){
// lastInputLeftRight = 1;
// }
//
// if(Like10key == 5) Like10key = 0;
// direction = Like10key;
//if(user==1) dm(Up+","+Right+","+Down+","+Left);
setDirectionInputState(Up, Right, Down, Left);
}
function setDirectionInputState(up, right, down, left)
{
var inputLike10key = 0;
inputLeft = false;
inputRight = false;
if(up){
inputLike10key = 8 - (left) + (right);
}else if(down){
inputLike10key = 2 - (left) + (right);
}else{
inputLike10key = 5 - (left) + (right);
}
if(left){
lastInputLeftRight = -1;
inputLeft = true;
}else if(right){
lastInputLeftRight = 1;
inputRight = true;
}
if(inputLike10key == 5) inputLike10key = 0;
pDirection = inputLike10key;
}
function setDirection(d){
switch (d){
case dNeutral:
setDirectionInputState(false, false, false, false);
break;
case dUp:
setDirectionInputState(true, false, false, false);
break;
case dRight:
setDirectionInputState(false, true, false, false);
break;
case dDown:
setDirectionInputState(false, false, true, false);
break;
case dLeft:
setDirectionInputState(false, false, false, true);
break;
case dUpRight:
setDirectionInputState(true, true, false, false);
break;
case dDownRight:
setDirectionInputState(false, true, true, false);
break;
case dDownLeft:
setDirectionInputState(false, false, true, true);
break;
case dUpLeft:
setDirectionInputState(true, false, false, true);
break;
}
return d;
}
property direction
{
getter(){
return pDirection;
}
setter(d){
setDirection(d);
}
}
function getInputKey()
{
var s;
var exp;
var mode = (user==0 && ( sf.pad1InputForChara1 || ( bao.players.count>0 && bao.players[0].chara==chrChocolat)));
// 特殊攻撃ボタン
s = false;
if(owner.windowActive){
for(var i=0; i<((mode)?sf.keySpecial[user].count:1); i++){
if(sf.keySpecial[user][i] !== void) s = s || getKeyState(sf.keySpecial[user][i]);
}
}
state[keySpecial].set(s);
// 緊急回避攻撃ボタン
s = false;
if(owner.windowActive){
for(var i=0; i<((mode)?sf.keyEscAttack[user].count:1); i++){
if(sf.keyEscAttack[user][i] !== void) s = s || getKeyState(sf.keyEscAttack[user][i]);
}
}
state[keyEscAttack].set(s);
// 攻撃ボタン
s = false;
if(owner.windowActive){
for(var i=0; i<((mode)?sf.keyAttack[user].count:1); i++){
if(sf.keyAttack[user][i] !== void) s = s || getKeyState(sf.keyAttack[user][i]);
}
}
state[keyAttack].set(s);
if(s && inputAttackTick == 0) inputAttackTick = owner.tickCount;
if(!s && inputAttackTick > 0) inputAttackTick = 0;
// ダッシュボタン
s = false;
if(owner.windowActive){
// if(!mode){
// var u = (user==0)?1:0;
// if(sf.keyNext[user][u] !== void) s = s || gpp.getPadState(sf.keyNext[user][u]);
// if(sf.keyPrev[user][u] !== void) s = s || gpp.getPadState(sf.keyPrev[user][u]);
// }else{
// if(sf.keyNext[1][0] !== void) s = s || gpp.getPadState(sf.keyNext[1][0]);
// if(sf.keyPrev[1][0] !== void) s = s || gpp.getPadState(sf.keyPrev[1][0]);
// }
var u = (user==0)?1:0;
if(sf.keyNext[user][u] !== void) s = s || gpp.getPadState(sf.keyNext[user][u]);
if(sf.keyPrev[user][u] !== void) s = s || gpp.getPadState(sf.keyPrev[user][u]);
}
state[keyDash].set(s, "command[cmdDash]=true");
// ジャンプボタン
s = false;
if(owner.windowActive){
for(var i=0; i<((mode)?sf.keyJump[user].count:1); i++){
if(sf.keyJump[user][i] !== void) s = s || getKeyState(sf.keyJump[user][i]);
}
}
state[keyJump].set(s, exp);
// ポーズ
s = false;
if(owner.windowActive){
//dm(user);
for(var i=0; i<((mode)?sf.keyPause[user].count:1); i++){
if(sf.keyPause[user][i] !== void) s = s || getKeyState(sf.keyPause[user][i]);
}
if(sf.keyPause[0][0] !== void) s = s || getKeyState(sf.keyPause[0][0]);
}
if(s){
if(!owner.pauseInKey && owner.disablePauseKey==0){
owner.onPauseKey();
owner.pauseInKey = true;
}
owner.disablePauseKey = 15;
}
if(owner.disablePauseKey > 0){
owner.disablePauseKey--;
}else{
owner.pauseInKey = false;
}
// 交代ボタン
s = false;
if(owner.windowActive){
for(var i=0; i<((mode)?sf.keySwitch[user].count:1); i++){
if(sf.keySwitch[user][i] !== void) s = s || getKeyState(sf.keySwitch[user][i]);
}
}
state[keySwitch].set(s);
// 任せてボタン
s = false;
if(owner.windowActive){
for(var i=0; i<((mode)?sf.keyLeaveIt[user].count:1); i++){
if(sf.keyLeaveIt[user][i] !== void) s = s || getKeyState(sf.keyLeaveIt[user][i]);
}
}
state[keyLeaveIt].set(s);
// 攻撃ジャンプ同時押しボタン
s = false;
if(owner.windowActive){
for(var i=0; i<((mode)?sf.keyBC[user].count:1); i++){
if(sf.keyBC[user][i] !== void) s = s || getKeyState(sf.keyBC[user][i]);
}
}
if(s){
state[keyAttack].set(s);
state[keyJump].set(s);
}
// if( get(keyAttack) && inputAttackTick == 0) inputAttackTick = owner.tickCount;
// if(!get(keyAttack) && inputAttackTick > 0) inputAttackTick = 0;
}
function set(key)
{
state[key].set(true);
}
function get(key)
{
return state[key].enter;
}
function getKeyState(key){
// if(key <VK_PAD1) return kag.getKeyState(key);
// return gpp.getPadState(key);
var ks = kag.getKeyState(key);
if(ks > 0){
//dm("1111 " + key + " / " + ks);
return ks;
}
//dm("2222 " + key + " / " + gpp.getPadState(key));
return gpp.getPadState(key);
}
function addHistory()
{
// コマンド処理用に入力方向を溜めておく
if(history.count==30) history.erase(0);
history.add(direction);
}
function checkCommand()
{
var str = history.join("");
for(var i=0; i<owner.commandList.count; i++){
for(var j=0; j<owner.commandList[i].count; j++){
var r = new RegExp(owner.commandList[i][j]);
if(r.test(str)){
command[i] = true;
commandNum = j;
//dm(str + " / " + ((!commandNum)?"→":"←") + " / " + owner.commandList[i][j]);
// window.caption = command;
}
}
}
// window.caption = 0;
}
// function dm()
// {
// var str = history.join("");
// Debug.message(str);
// }
}
function keyCodeToKeyName(c)
{
switch (c){
case 0x08: return "BACK";
case 0x09: return "TAB";
case 0x0C: return "CLEAR";
case 0x0D: return "RETURN";
case 0x10:
if(System.getKeyState(VK_RSHIFT)) return "R-Shift";
if(System.getKeyState(VK_LSHIFT)) return "L-Shift";
return "SHIFT";
// case 0x11: return "CONTROL";
case 0x11:
if(System.getKeyState(VK_LCONTROL)) return "L-Ctrl";
if(System.getKeyState(VK_RCONTROL)) return "R-Ctrl";
return "CONTROL";
// case 0x12: return "MENU";
case 0x12:
if(System.getKeyState(VK_LMENU)) return "L-Alt";
if(System.getKeyState(VK_RMENU)) return "R-Alt";
return "MENU";
// case 0x13: return "PAUSE";
// case 0x14: return "CAPITAL";
// case 0x15: return "KANA";
// case 0x15: return "HANGEUL";
// case 0x15: return "HANGUL";
// case 0x17: return "JUNJA";
// case 0x18: return "FINAL";
// case 0x19: return "HANJA";
// case 0x19: return "KANJI";
// case 0x1B: return "ESCAPE";
// case 0x1C: return "CONVERT";
// case 0x1D: return "NONCONVERT";
// case 0x1E: return "ACCEPT";
// case 0x1F: return "MODECHANGE";
case 0x20: return "SPACE";
case 0x21: return "PRIOR";
case 0x22: return "NEXT";
case 0x23: return "END";
case 0x24: return "HOME";
case 0x25: return "LEFT";
case 0x26: return "UP";
case 0x27: return "RIGHT";
case 0x28: return "DOWN";
case 0x29: return "SELECT";
case 0x2A: return "PRINT";
case 0x2B: return "EXECUTE";
case 0x2C: return "SNAPSHOT";
case 0x2D: return "INSERT";
case 0x2E: return "DELETE";
case 0x2F: return "HELP";
case 0x30: return "0";
case 0x31: return "1";
case 0x32: return "2";
case 0x33: return "3";
case 0x34: return "4";
case 0x35: return "5";
case 0x36: return "6";
case 0x37: return "7";
case 0x38: return "8";
case 0x39: return "9";
case 0x41: return "A";
case 0x42: return "B";
case 0x43: return "C";
case 0x44: return "D";
case 0x45: return "E";
case 0x46: return "F";
case 0x47: return "G";
case 0x48: return "H";
case 0x49: return "I";
case 0x4A: return "J";
case 0x4B: return "K";
case 0x4C: return "L";
case 0x4D: return "M";
case 0x4E: return "N";
case 0x4F: return "O";
case 0x50: return "P";
case 0x51: return "Q";
case 0x52: return "R";
case 0x53: return "S";
case 0x54: return "T";
case 0x55: return "U";
case 0x56: return "V";
case 0x57: return "W";
case 0x58: return "X";
case 0x59: return "Y";
case 0x5A: return "Z";
case 0x5B: return "LWIN";
case 0x5C: return "RWIN";
case 0x5D: return "APPS";
case 0x60: return "NUMPAD0";
case 0x61: return "NUMPAD1";
case 0x62: return "NUMPAD2";
case 0x63: return "NUMPAD3";
case 0x64: return "NUMPAD4";
case 0x65: return "NUMPAD5";
case 0x66: return "NUMPAD6";
case 0x67: return "NUMPAD7";
case 0x68: return "NUMPAD8";
case 0x69: return "NUMPAD9";
case 0x6A: return "MULTIPLY";
case 0x6B: return "ADD";
case 0x6C: return "SEPARATOR";
case 0x6D: return "SUBTRACT";
case 0x6E: return "DECIMAL";
case 0x6F: return "DIVIDE";
// case 0x70: return "F1";
// case 0x71: return "F2";
// case 0x72: return "F3";
// case 0x73: return "F4";
// case 0x74: return "F5";
// case 0x75: return "F6";
// case 0x76: return "F7";
// case 0x77: return "F8";
// case 0x78: return "F9";
// case 0x79: return "F10";
// case 0x7A: return "F11";
// case 0x7B: return "F12";
// case 0x7C: return "F13";
// case 0x7D: return "F14";
// case 0x7E: return "F15";
// case 0x7F: return "F16";
// case 0x80: return "F17";
// case 0x81: return "F18";
// case 0x82: return "F19";
// case 0x83: return "F20";
// case 0x84: return "F21";
// case 0x85: return "F22";
// case 0x86: return "F23";
// case 0x87: return "F24";
// case 0x90: return "NUMLOCK";
// case 0x91: return "SCROLL";
// case 0xA0: return "LSHIFT";
// case 0xA1: return "RSHIFT";
// case 0xA2: return "LCONTROL";
// case 0xA3: return "RCONTROL";
// case 0xA4: return "LMENU";
// case 0xA5: return "RMENU";
case 0xF0: return "CapsLock";
default:
var str = ["未設定","Unconfigured","沒有設定","没有设定"];
return str[sf.language];
}
}