aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Michael Smith <mikesmiffy128@gmail.com> 2024-09-29 00:54:17 +0100
committerGravatar Michael Smith <mikesmiffy128@gmail.com> 2024-09-29 00:54:17 +0100
commit535a269761c761f22f003feaef11d619637019df (patch)
tree3e3d2282568683325ebfe6f7e26b4a4975e81f0a
parente3105ede1a5472f3f7968720a8997ac0e1e908d1 (diff)
downloadsst-535a269761c761f22f003feaef11d619637019df.tar.gz
sst-535a269761c761f22f003feaef11d619637019df.zip
Refine input HUD layouts
- Get rid of +left/+right things, as they were deemed unnecessary. - Add missing reload button in L4D games - Put a vertical gap between the group of directional buttons and attacks, and all the other buttons. While we're at it, add a few branch hints and fix up the includes.
-rw-r--r--src/inputhud.c140
1 files changed, 77 insertions, 63 deletions
diff --git a/src/inputhud.c b/src/inputhud.c
index c4f7342..af3bb59 100644
--- a/src/inputhud.c
+++ b/src/inputhud.c
@@ -22,13 +22,14 @@
#include "engineapi.h"
#include "event.h"
#include "errmsg.h"
+#include "feature.h"
#include "gamedata.h"
#include "gametype.h"
#include "hexcolour.h"
#include "hook.h"
#include "hud.h"
#include "intdefs.h"
-#include "feature.h"
+#include "langext.h"
#include "mem.h"
#include "vcall.h"
#include "x86.h"
@@ -191,90 +192,107 @@ static const struct {
struct layout {
int mask;
schar w, h;
- struct { schar x, y; } pos[20]; // XXX: should make flexible???
+ // TODO(opt): should make this flexible, but that's harder than it sounds
+ struct { schar x, y; } pos[20];
};
// input layouts (since some games don't use all input bits) {{{
static const struct layout layout_hl2 = {
- IN_ATTACK | IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_USE | IN_LEFT |
- IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_ATTACK2 | IN_RELOAD | IN_SPEED |
+ IN_ATTACK | IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_USE |
+ IN_MOVELEFT | IN_MOVERIGHT | IN_ATTACK2 | IN_RELOAD | IN_SPEED |
IN_WALK | IN_ZOOM,
- 15, 6,
+ 15, 7,
{
- // F 1 2
- // L B R U R Z
- // W S D J l r
- /* IN_ATTACK */ {10, 0}, /* IN_JUMP */ { 6, 4},
- /* IN_DUCK */ { 4, 4}, /* IN_FORWARD */ { 3, 0},
- /* IN_BACK */ { 3, 2}, /* IN_USE */ { 9, 2},
- /* IN_CANCEL */ {0}, /* IN_LEFT */ {10, 4},
- /* IN_RIGHT */ {12, 4}, /* IN_MOVELEFT */ { 1, 2},
- /* IN_MOVERIGHT */ { 5, 2}, /* IN_ATTACK2 */ {12, 0},
- /* IN_RUN */ {0}, /* IN_RELOAD */ {11, 2},
+ // F
+ // 1 2
+ // L B R
+ //
+ //
+ // W S D J U R Z
+ //
+ /* IN_ATTACK */ {10, 1}, /* IN_JUMP */ { 6, 5},
+ /* IN_DUCK */ { 4, 5}, /* IN_FORWARD */ { 3, 0},
+ /* IN_BACK */ { 3, 2}, /* IN_USE */ { 9, 5},
+ /* IN_CANCEL */ {0}, /* IN_LEFT */ {0},
+ /* IN_RIGHT */ {0}, /* IN_MOVELEFT */ { 1, 2},
+ /* IN_MOVERIGHT */ { 5, 2}, /* IN_ATTACK2 */ {12, 1},
+ /* IN_RUN */ {0}, /* IN_RELOAD */ {11, 5},
/* IN_ALT1 */ {0}, /* IN_ALT2 */ {0},
- /* IN_SCORE */ {0}, /* IN_SPEED */ { 2, 4},
- /* IN_WALK */ { 0, 4}, /* IN_ZOOM */ {13, 2}
+ /* IN_SCORE */ {0}, /* IN_SPEED */ { 2, 5},
+ /* IN_WALK */ { 0, 5}, /* IN_ZOOM */ {13, 5}
}
};
static const struct layout layout_portal1 = {
- IN_ATTACK | IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_USE | IN_LEFT |
- IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_ATTACK2,
- 11, 6,
+ IN_ATTACK | IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_USE |
+ IN_MOVELEFT | IN_MOVERIGHT | IN_ATTACK2,
+ 11, 7,
{
- // F 1 2
- // L B R U
- // D J l r
- /* IN_ATTACK */ {7, 0}, /* IN_JUMP */ {3, 4},
- /* IN_DUCK */ {1, 4}, /* IN_FORWARD */ {2, 0},
- /* IN_BACK */ {2, 2}, /* IN_USE */ {8, 2},
- /* IN_CANCEL */ {0}, /* IN_LEFT */ {7, 4},
- /* IN_RIGHT */ {9, 4}, /* IN_MOVELEFT */ {0, 2},
- /* IN_MOVERIGHT */ {4, 2}, /* IN_ATTACK2 */ {9, 0}
+ // F
+ // 1 2
+ // L B R
+ //
+ //
+ // D J U
+ //
+ /* IN_ATTACK */ {7, 1}, /* IN_JUMP */ {3, 5},
+ /* IN_DUCK */ {1, 5}, /* IN_FORWARD */ {2, 0},
+ /* IN_BACK */ {2, 2}, /* IN_USE */ {8, 5},
+ /* IN_CANCEL */ {0}, /* IN_LEFT */ {0},
+ /* IN_RIGHT */ {0}, /* IN_MOVELEFT */ {0, 2},
+ /* IN_MOVERIGHT */ {4, 2}, /* IN_ATTACK2 */ {9, 1}
}
};
// TODO(compat): add portal2 layout once there's hud gamedata for portal 2
//static const struct layout layout_portal2 = {
-// IN_ATTACK | IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_USE | IN_LEFT |
-// IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_ATTACK2 | IN_ZOOM,
-// 11, 6,
+// IN_ATTACK | IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_USE |
+// IN_MOVELEFT | IN_MOVERIGHT | IN_ATTACK2 | IN_ZOOM,
+// 11, 7,
// {
-// // F 1 2
-// // L B R U Z
-// // D J l r
-// /* IN_ATTACK */ {7, 0}, /* IN_JUMP */ {3, 4},
-// /* IN_DUCK */ {1, 4}, /* IN_FORWARD */ {2, 0},
-// /* IN_BACK */ {2, 2}, /* IN_USE */ {7, 2},
-// /* IN_CANCEL */ {0}, /* IN_LEFT */ {7, 4},
-// /* IN_RIGHT */ {9, 4}, /* IN_MOVELEFT */ {0, 2},
-// /* IN_MOVERIGHT */ {4, 2}, /* IN_ATTACK2 */ {9, 0},
+// // F
+// // 1 2
+// // L B R
+// //
+// //
+// // D J U Z
+// //
+// /* IN_ATTACK */ {7, 1}, /* IN_JUMP */ {3, 5},
+// /* IN_DUCK */ {1, 5}, /* IN_FORWARD */ {2, 0},
+// /* IN_BACK */ {2, 2}, /* IN_USE */ {7, 5},
+// /* IN_CANCEL */ {0}, /* IN_LEFT */ {0},
+// /* IN_RIGHT */ {0}, /* IN_MOVELEFT */ {0, 2},
+// /* IN_MOVERIGHT */ {4, 2}, /* IN_ATTACK2 */ {9, 1},
// /* IN_RUN */ {0}, /* IN_RELOAD */ {0},
// /* IN_ALT1 */ {0}, /* IN_ALT2 */ {0},
// /* IN_SCORE */ {0}, /* IN_SPEED */ {0},
-// /* IN_WALK */ {0}, /* IN_ZOOM */ {9, 2}
+// /* IN_WALK */ {0}, /* IN_ZOOM */ {9, 5}
// }
//};
static const struct layout layout_l4d = {
- IN_ATTACK | IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_USE | IN_LEFT |
- IN_RIGHT | IN_MOVELEFT | IN_MOVERIGHT | IN_ATTACK2 | IN_SPEED | IN_ZOOM,
- 11, 6,
+ IN_ATTACK | IN_JUMP | IN_DUCK | IN_FORWARD | IN_BACK | IN_USE |
+ IN_MOVELEFT | IN_MOVERIGHT | IN_ATTACK2 | IN_RELOAD | IN_SPEED | IN_ZOOM,
+ 13, 7,
{
- // F 1 2
- // L B R U Z
- // W D J l r
- /* IN_ATTACK */ {7, 0}, /* IN_JUMP */ {4, 4},
- /* IN_DUCK */ {2, 4}, /* IN_FORWARD */ {2, 0},
- /* IN_BACK */ {2, 2}, /* IN_USE */ {7, 2},
- /* IN_CANCEL */ {0}, /* IN_LEFT */ {7, 4},
- /* IN_RIGHT */ {9, 4}, /* IN_MOVELEFT */ {0, 2},
- /* IN_MOVERIGHT */ {4, 2}, /* IN_ATTACK2 */ {9, 0},
- /* IN_RUN */ {0}, /* IN_RELOAD */ {0},
+ // F
+ // 1 2
+ // L B R
+ //
+ //
+ // S D J U R Z
+ //
+ /* IN_ATTACK */ {8, 1}, /* IN_JUMP */ {4, 5},
+ /* IN_DUCK */ {2, 5}, /* IN_FORWARD */ {2, 0},
+ /* IN_BACK */ {2, 2}, /* IN_USE */ {7, 5},
+ /* IN_CANCEL */ {0}, /* IN_LEFT */ {0},
+ /* IN_RIGHT */ {0}, /* IN_MOVELEFT */ {0, 2},
+ /* IN_MOVERIGHT */ {4, 2}, /* IN_ATTACK2 */ {10, 1},
+ /* IN_RUN */ {0}, /* IN_RELOAD */ {9, 5},
/* IN_ALT1 */ {0}, /* IN_ALT2 */ {0},
- /* IN_SCORE */ {0}, /* IN_SPEED */ {0, 4},
- /* IN_WALK */ {0}, /* IN_ZOOM */ {9, 2}
+ /* IN_SCORE */ {0}, /* IN_SPEED */ {0, 5},
+ /* IN_WALK */ {0}, /* IN_ZOOM */ {11, 5}
}
};
@@ -368,11 +386,7 @@ INIT {
return false;
}
for (int i = 0; i < countof(fontnames); ++i) {
- fonts[i].h = hud_getfont(fontnames[i], true);
- if (!fonts[i].h) {
- errmsg_warnx("couldn't get \"%s\" font", fontnames[i]);
- }
- else {
+ if (fonts[i].h = hud_getfont(fontnames[i], true)) {
int dummy;
// use (roughly) the widest string as a reference for what will fit
hud_textsize(fonts[i].h, L"Speed", &fonts[i].sz, &dummy);
@@ -380,7 +394,7 @@ INIT {
}
void **vtable = mem_loadptr(input);
// just unprotect the first few pointers (GetUserCmd is 8)
- if (!os_mprot(vtable, sizeof(void *) * 8, PAGE_READWRITE)) {
+ if_cold (!os_mprot(vtable, sizeof(void *) * 8, PAGE_READWRITE)) {
errmsg_errorsys("couldn't make virtual table writable");
return false;
}