Re: Updated includes for BGT (includes bgt2py and 1st person sound pool)

I'm going to go ahead and paste the most recent version of keyconfig from my Dropbox. I forget what all changed, but I think this version handles modifiers better, and might have fixed some bugs that would cause it to crash.

dictionary keynames;

// Constants for auxiliary commands:
const int KC_MOUSE1=-2, KC_MOUSE2=-3, KC_MOUSE3=-4, KC_MOUSE4=-5, KC_MOUSE5=-6, KC_MOUSE6=-7, KC_MOUSE7=-8, KC_MOUSE8=-9, KC_MOUSE9=-10;

// Modifier constants:
const uint8 alt=1, shift=2, ctrl=4;

class keyconfig {
int[] keys;
bool[] flags;
uint8[] modifiers; // 2:43 AM 8/26/2018.
string[] names;
keyconfig() {
init_keynames();
}
keyconfig(int size) {
init_keynames();
this.keys.resize(size);
this.names.resize(size);
this.flags.resize(size);
this.modifiers.resize(size);
for(uint i=0; i<size; i++) this.modifiers[i]=0;
}
keyconfig(string txt) {
init_keynames();
this.load(txt);
}

int getKey(int k) {
return this.keys.find(k);
}
int press(int k, uint8 mods=0) {
int index=this.keys.find(k);
if(index>=0 and this.modifiers[index]!=mods) {
for(uint i=index+1; i<this.keys.length(); i++) {
if(this.keys[i]==k and this.modifiers[i]==mods) {
index=i;
break;
}// match found.
}
}// With modifiers.
if(index>=0) {
if(this.flags[index]) return -1;
else {
this.flags[index]=true;
return index;
}
}
return index;
}
int release(int k, uint8 mods=0) {
int index=this.keys.find(k);
if(index<0) return index;
// Modifiers are important!
/*else if(this.flags[index]) {
this.flags[index]=false;
return index;
}
else return -1;
*/
for(uint i=index; i<this.keys.length(); i++) {
if(this.keys[i]==k and this.flags[i] and (mods==0 or mods==this.modifiers[i])) {
this.flags[i]=false;
index=i;
}
else if(index==i) index=-1; // So we can return -1 if nothing was released.
}
return index;
}

bool key_down(int index) {
return (index>=0 and index<this.flags.length() and this.flags[index]);
}
bool key_up(int index) {
return !this.key_down(index);
}
int getKey(string name) {
return this.names.find(name);
}

bool load(string txt) {
string[] lines=string_split(string_replace(txt, "\r", "\n", true), "\n", true);
uint index=0;
while(index<lines.length() and !string_is_digits(lines[index])) {index++;}
if(index>=lines.length()) {
alert("Error in keyconfig.load", "Number of elements was not found.");
return false;
}
uint l=string_to_number(lines[index]);
this.names.resize(l);
this.flags.resize(l);
this.keys.resize(l);
this.modifiers.resize(l);
for(uint i=1; i<=l; i++) {
if(index+i-1>=lines.length()) {
alert("Error in keyconfig.load", "Index out of bounds. Total lines: " + lines.length() + ", expected entries: " + l + ", starting index: " + index + ", i:" + i + ".");
return false;
}
string[] parts=string_split(lines[index+i-1], ":", true);
if(parts.length()<2) continue;
this.names[i-1]=parts[0];
this.keys[i-1]=key_code(parts[1]);
this.flags[i-1]=false;
if(parts[1].length()>1 and string_contains("+-=", string_right(parts[1], 1), 1)>=0) {
string c=string_right(parts[1], 1);
if(c=="+") this.modifiers[i-1]=shift;
else if(c=="-") this.modifiers[i-1]=ctrl;
else this.modifiers[i-1]=alt;
}
else this.modifiers[i-1]=0;
}
return true;
}
string to_string(string header="") {
uint l=this.keys.length();
string ret=header + "\r\n" + l + "\r\n";
for(uint i=0; i<l; i++) ret += this.names[i] + ":" + key_name(this.keys[i]) + mod_name(this.modifiers[i]) + "\r\n";
return ret;
}
bool save(string filename, string header="") {
file fout;
fout.open(filename, "w");
fout.write(this.to_string(header));
fout.close();
return true;
}
void update() {
int k;
for(uint i=0; i<this.keys.length(); i++) {
k=this.keys[i];
if(k<0) {
if(k>=-10 and k<-1) {
k=absolute(k+1); // Or is it +2?
this.flags[i]=mouse_down(k);
}
else if(k==-1) continue;
}// Mouse, etc.
else if(this.modifiers[i]==0 and key_pressed(k)) this.press(k);
else if(this.modifiers[i]!=0 and key_down(k) and !this.flags[i]) {
uint8 m=0;
if(key_down(KEY_LSHIFT) or key_down(KEY_RSHIFT)) m|=shift;
if(key_down(KEY_LCONTROL) or key_down(KEY_RCONTROL)) m|=ctrl;
if(key_down(KEY_LMENU) or key_down(KEY_RMENU)) m|=alt;
if(((this.modifiers[i])&m)==this.modifiers[i]) this.flags[i]=true;
}
else if(key_released(k)) this.flags[i]=false; //this.release(k);
else if(key_down(k) and !this.flags[i]) this.press(k);
else if(key_up(k) and this.flags[i]) this.flags[i]=false; //this.release(k);
}
}
}


void init_keynames() {
if(keynames.exists("A")) return;
// Let's do this the somewhat easy way:
int[] codes={KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_SPACE, KEY_LCONTROL, KEY_RCONTROL, KEY_LMENU, KEY_RMENU, KEY_LSHIFT, KEY_RSHIFT, KEY_COMMA, KEY_PERIOD, KEY_SLASH, KEY_BACK, KEY_BACKSLASH, KEY_RETURN, KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_0, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_MINUS, KEY_ADD, KEY_NUMPAD0, KEY_NUMPAD1, KEY_NUMPAD2, KEY_NUMPAD3, KEY_NUMPAD4, KEY_NUMPAD5, KEY_NUMPAD6, KEY_NUMPAD7, KEY_NUMPAD8, KEY_NUMPAD9, KEY_HOME, KEY_PRIOR, KEY_NEXT, KEY_END, KEY_DELETE, KEY_LBRACKET, KEY_RBRACKET, KEY_TAB, KEY_EQUALS, KEY_MULTIPLY, KEY_DIVIDE, KEY_ESCAPE, KEY_SEMICOLON, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KC_MOUSE1, KC_MOUSE2, KC_MOUSE3, KC_MOUSE4, KC_MOUSE5, KC_MOUSE6, KC_MOUSE7, KC_MOUSE8, KC_MOUSE9};
string[] descs={"left", "right", "up", "down", "space", "lctrl", "rcrtl", "lalt", "ralt", "lshift", "rshift", ",", ".", "/", "back", "\\", "enter", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "0", "2", "3", "4", "5", "6", "7", "8", "9", "-", "+", "#0", "#1", "#2", "#3", "#4", "#5", "#6", "#7", "#8", "#9", "home", "pgup", "pgdn", "end", "del", "[", "]", "tab", "=", "*", "#/", "esc", ";", "f1", "f2", "f3", "F4", "f5", "F6", "F7", "f8", "F9", "f10", "f11", "f12", "MOUSE1", "MOUSE2", "MOUSE3", "MOUSE4", "MOUSE5", "MOUSE6", "MOUSE7", "MOUSE8", "MOUSE9"};
//string txt="Key mappings, for what it\'s worth:\r\n";
for(uint i=0; i<codes.length(); i++) {//txt += codes[i] + ", " + descs[i] + "\r\n";
keynames.set(string_to_upper_case(descs[i]), codes[i]);
}
//clipboard_copy_text(txt);
}

int key_code(string n) {
int ret=-1;
n=string_to_upper_case(n);
if(n.length()>1 and string_contains("+-=", string_right(n, 1), 1)>=0) n=string_trim_right(n, 1);
if(keynames.exists(n)) keynames.get(n, ret);
return ret;
}

string key_name(int k) {
// this one is going to hurt.
string[] keys=keynames.get_keys();
for(uint i=0; i<keys.length(); i++) {
int cur;
keynames.get(keys[i], cur);
if(cur==k) return keys[i];
}
return "";
}

keyconfig@ load_keyconfig(string filename) {
if(!file_exists(filename)) {
alert("Error in load_keyconfig", "The \'" + filename + "\' file could not be found. Check the spelling and try again.");
return null;
}
file fin;
fin.open(filename, "r");
keyconfig ret(fin.read(0));
fin.close();
return ret;
}


// 3:04 AM 8/26/2018: Update to support modifiers.
string mod_name(uint8 m) {
if(m==shift) return "+";
else if(m==ctrl) return "-";
else if(m==alt) return "=";
return "";
}
-- 
Audiogames-reflector mailing list
Audiogames-reflector@sabahattin-gucukoglu.com
https://sabahattin-gucukoglu.com/cgi-bin/mailman/listinfo/audiogames-reflector
  • ... AudioGames . net Forum — Developers room : CAE_Jones via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : JLove via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : JLove via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : JLove via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : JLove via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : CAE_Jones via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : CAE_Jones via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : JLove via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : CAE_Jones via Audiogames-reflector
    • ... AudioGames . net Forum — Developers room : CAE_Jones via Audiogames-reflector

Reply via email to