Add action mapping

This commit is contained in:
2023-04-25 21:59:12 +00:00
parent dc1fda6611
commit 02707a9ada
5 changed files with 115 additions and 22 deletions

View File

@@ -406,22 +406,52 @@ var physics = {
},
};
var Action = {
add_new(name) {
var action = Object.create(Action);
action.name = name;
action.inputs = [];
this.actions.push(action);
return action;
},
actions: [],
};
/* May be a human player; may be an AI player */
var Player = {
pawns: [],
players: [],
input(fn, ...args) {
this.pawns.forEach(x => if (fn in x) x[fn](...args));
this.pawns.forEach(x => { if (fn in x) x[fn](...args); });
},
control(pawn) {
this.pawns.pushunique(pawn);
this.pawns.push_unique(pawn);
},
uncontrol(pawn) {
this.pawns = this.pawns.filter(x => x !== pawn);
}
},
};
for (var i = 0; i < 4; i++) {
var player1 = Object.create(Player);
player1.pawns = [];
player1.gamepads = [];
Player.players.push(player1);
}
function state2str(state) {
switch (state) {
case 0:
return "down";
case 1:
return "pressed";
case 2:
return "released";
}
}
var Register = {
updates: [],
update(dt) {
@@ -443,16 +473,25 @@ var Register = {
this.nk_guis.forEach(x => x[0].call(x[1]));
},
pawns: [],
pawn_input(fn, ...args) {
this.pawns.forEach(x => {
if (fn in x) {
x[fn](...args);
}
});
kbm_input(fn, ...args) {
Player.players[0].input(fn, ...args);
},
controller_input(
gamepad_playermap: [],
gamepad_input(pad, btn, state, ...args) {
var player = this.gamepad_playermap[pad];
if (!player) return;
var statestr = state2str(state);
var rawfn = `gamepad_${btn}_${statestr}`;
player.input(rawfn, ...args);
Action.actions.forEach(x => {
if (x.inputs.includes(btn))
player.input(`action_${x.name}_${statestr}`, ...args);
});
},
debugs: [],
debug() {
@@ -463,9 +502,10 @@ var Register = {
this.updates = this.updates.filter(x => x[1] !== obj);
this.guis = this.guis.filter(x => x[1] !== obj);
this.nk_guis = this.nk_guis.filter(x => x[1] !== obj);
this.pawns = this.pawns.filter(x => x[1] !== obj);
this.debugs = this.debugs.filter(x => x[1] !== obj);
this.physupdates = this.physupdates.filter(x => x[1] !== obj);
Player.players.forEach(x => x.uncontrol(obj));
},
};
register(0, Register.update, Register);
@@ -473,7 +513,10 @@ register(1, Register.physupdate, Register);
register(2, Register.gui, Register);
register(3, Register.nk_gui, Register);
register(6, Register.debug, Register);
register(7, Register.pawn_input, Register);
register(7, Register.kbm_input, Register);
register(8, Register.gamepad_input, Register);
Register.gamepad_playermap[0] = Player.players[0];
function register_update(fn, obj) {
Register.updates.push([fn, obj ? obj : null]);
@@ -505,12 +548,13 @@ function unregister_nk_gui(fn, obj) {
register_update(Yugine.exec, Yugine);
function set_pawn(obj) {
Register.pawns.push(obj);
/* These functions are the "defaults", and give control to player0 */
function set_pawn(obj, player = Player.players[0]) {
player.control(obj);
}
function unset_pawn(obj) {
Register.pawns = Register.pawns.filter(x => x !== obj);
function unset_pawn(obj, player = Player.players[0]) {
player.uncontrol(obj);
}
var Signal = {