Skip to content

Commit c5aba76

Browse files
committed
Add a setting to adjust rumble intensity (or turn it off)
1 parent 582134c commit c5aba76

File tree

10 files changed

+124
-61
lines changed

10 files changed

+124
-61
lines changed

src/audio/Adlib.zig

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -369,36 +369,38 @@ fn playTrack(ctx: *anyopaque, track: ?AudioTrack) void {
369369
fn triggerEvent(ctx: *anyopaque, event: GameEvent) void {
370370
const self: *Adlib = @ptrCast(@alignCast(ctx));
371371
switch (event) {
372-
.Event_HitEnemy => {
372+
.None => {},
373+
.HitEnemy => {
373374
self.playSfx(1);
374375
},
375-
.Event_HitPlayer => {
376+
.HitPlayer => {
376377
self.playSfx(4);
377378
},
378-
.Event_PlayerHeadImpact => {
379+
.PlayerHeadImpact => {
379380
self.playSfx(5);
380381
},
381-
.Event_PlayerPickup, .Event_PlayerPickupEnemy => {
382+
.PlayerPickup, .PlayerPickupEnemy => {
382383
self.playSfx(9);
383384
},
384-
.Event_PlayerThrow => {
385+
.PlayerThrow => {
385386
self.playSfx(3);
386387
},
387-
.Event_PlayerJump => {
388+
.PlayerJump => {
388389
// Nothing here, but we could
389390
},
390-
.Event_BallBounce => {
391+
.BallBounce => {
391392
self.playSfx(12);
392393
},
393-
.Event_PlayerCollectWaypoint => {
394+
.PlayerCollectWaypoint => {
394395
self.playTrackNumber(5);
395396
},
396-
.Event_PlayerCollectBonus => {
397+
.PlayerCollectBonus => {
397398
self.playTrackNumber(6);
398399
},
399-
.Event_PlayerCollectLamp => {
400+
.PlayerCollectLamp => {
400401
self.playTrackNumber(7);
401402
},
403+
.Options_TestRumble => {},
402404
}
403405
}
404406

src/enemies.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,7 @@ void SET_NMI(TITUS_level *level) {
12551255
}
12561256
}
12571257
// If final enemy, remove energy
1258-
playEvent_c(Event_HitEnemy);
1258+
playc(HitEnemy);
12591259
DROP_FLAG = 0;
12601260
if (level->enemy[i].boss) {
12611261
if (INVULNERABLE_FLAG != 0) {
@@ -1342,7 +1342,7 @@ void ACTIONC_NMI(TITUS_level *level, TITUS_enemy *enemy) {
13421342
}
13431343

13441344
void KICK_ASH(TITUS_level *level, TITUS_sprite *enemysprite, int16_t power) {
1345-
playEvent_c(Event_HitPlayer);
1345+
playc(HitPlayer);
13461346
TITUS_sprite *p_sprite = &(level->player.sprite);
13471347
DEC_ENERGY(level);
13481348
DEC_ENERGY(level);

src/enemies.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,7 +1151,7 @@ pub fn SET_NMI(level: *lvl.Level) void {
11511151
level.object[@as(c_ushort, @intCast(k))].sprite.speed_x = @as(i16, @bitCast(@as(c_short, @truncate(0 - @as(c_int, @bitCast(@as(c_int, level.object[@as(c_ushort, @intCast(k))].sprite.speed_x)))))));
11521152
}
11531153
}
1154-
events.triggerEvent(.Event_HitEnemy);
1154+
events.triggerEvent(.HitEnemy);
11551155
globals.DROP_FLAG = false;
11561156
if (enemy.boss) {
11571157
if (@as(c_int, @bitCast(@as(c_uint, globals.INVULNERABLE_FLAG))) != 0) {
@@ -1223,7 +1223,7 @@ fn ACTIONC_NMI(level: *lvl.Level, enemy: *lvl.Enemy) void {
12231223
}
12241224

12251225
fn KICK_ASH(level: *lvl.Level, enemysprite: *lvl.Sprite, power: i16) void {
1226-
events.triggerEvent(.Event_HitPlayer);
1226+
events.triggerEvent(.HitPlayer);
12271227
const p_sprite = &level.player.sprite;
12281228

12291229
// about 2 seconds worth of invulnereability frames

src/events.zig

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@ const audio = @import("audio/audio.zig");
22
const input = @import("input.zig");
33

44
pub const GameEvent = enum {
5-
Event_HitEnemy,
6-
Event_HitPlayer,
7-
Event_PlayerHeadImpact,
8-
Event_PlayerPickup,
9-
Event_PlayerPickupEnemy,
10-
Event_PlayerThrow,
11-
Event_PlayerJump,
12-
Event_BallBounce,
13-
Event_PlayerCollectWaypoint,
14-
Event_PlayerCollectBonus,
15-
Event_PlayerCollectLamp,
5+
None,
6+
HitEnemy,
7+
HitPlayer,
8+
PlayerHeadImpact,
9+
PlayerPickup,
10+
PlayerPickupEnemy,
11+
PlayerThrow,
12+
PlayerJump,
13+
BallBounce,
14+
PlayerCollectWaypoint,
15+
PlayerCollectBonus,
16+
PlayerCollectLamp,
17+
Options_TestRumble,
1618
};
1719

1820
pub fn triggerEvent(event: GameEvent) void {

src/input.zig

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ pub fn setInputMode(input_mode: InputMode) void {
5858
// FIXME: save the file
5959
}
6060

61+
pub fn getRumble() u8 {
62+
return game.settings.rumble;
63+
}
64+
65+
pub fn setRumble(rumble: u8) void {
66+
game.settings.rumble = rumble;
67+
// FIXME: save the file
68+
}
69+
70+
6171
pub const InputAction = enum {
6272
None,
6373
Quit,
@@ -121,8 +131,11 @@ pub const GamepadState = struct {
121131
right_y: f32 = 0,
122132

123133
fn rumbleGamepad(self: GamepadState, left: f32, right: f32, duration_ms: u32) void {
124-
const left_i: u16 = @intFromFloat(std.math.lerp(0, 0xFFFF, left));
125-
const right_i: u16 = @intFromFloat(std.math.lerp(0, 0xFFFF, right));
134+
if (game.settings.rumble == 0)
135+
return;
136+
const multiplier: f32 = @as(f32, @floatFromInt(game.settings.rumble)) / 16.0;
137+
const left_i: u16 = @intFromFloat(std.math.lerp(0, 0xFFFF, left * multiplier));
138+
const right_i: u16 = @intFromFloat(std.math.lerp(0, 0xFFFF, right * multiplier));
126139
if(self.has_rumble) {
127140
if(!SDL.rumbleGamepad(self.handle, left_i, right_i, duration_ms))
128141
{
@@ -138,8 +151,11 @@ pub const GamepadState = struct {
138151
}
139152

140153
fn rumbleTriggers(self: GamepadState, left: f32, right: f32, duration_ms: u32) void {
141-
const left_i: u16 = @intFromFloat(std.math.lerp(0, 0xFFFF, left));
142-
const right_i: u16 = @intFromFloat(std.math.lerp(0, 0xFFFF, right));
154+
if (game.settings.rumble == 0)
155+
return;
156+
const multiplier: f32 = @as(f32, @floatFromInt(game.settings.rumble)) / 16.0;
157+
const left_i: u16 = @intFromFloat(std.math.lerp(0, 0xFFFF, left * multiplier));
158+
const right_i: u16 = @intFromFloat(std.math.lerp(0, 0xFFFF, right * multiplier));
143159
if(self.has_trigger_rumble) {
144160
if(!SDL.rumbleGamepadTriggers(self.handle, left_i, right_i, duration_ms))
145161
{
@@ -155,38 +171,40 @@ pub const GamepadState = struct {
155171
}
156172

157173
pub fn triggerRumble(self: GamepadState, event: GameEvent) void {
158-
159-
160174
switch (event) {
161-
.Event_HitEnemy =>
175+
.None => {},
176+
.HitEnemy =>
162177
{
163178
self.rumbleGamepad(0.25, 0.25, 150);
164179
},
165-
.Event_HitPlayer =>
180+
.HitPlayer =>
166181
{
167182
self.rumbleGamepad(1.0, 1.0, 75);
168183
},
169-
.Event_PlayerHeadImpact =>
184+
.PlayerHeadImpact =>
170185
{
171186
self.rumbleGamepad(0.33, 0.33, 800);
172187
},
173-
.Event_PlayerPickup,
174-
.Event_PlayerPickupEnemy,
175-
.Event_PlayerThrow => {
188+
.PlayerPickup,
189+
.PlayerPickupEnemy,
190+
.PlayerThrow => {
176191
self.rumbleTriggers(0.25, 0.25, 100);
177192
},
178-
.Event_PlayerCollectWaypoint,
179-
.Event_PlayerCollectBonus,
180-
.Event_PlayerCollectLamp =>
193+
.PlayerCollectWaypoint,
194+
.PlayerCollectBonus,
195+
.PlayerCollectLamp =>
181196
{
182197
self.rumbleGamepad(0.1, 0.1, 100);
183198
},
184-
.Event_PlayerJump => {
199+
.PlayerJump => {
185200
//self.rumbleGamepad(6000, 6000, 100);
186201
},
187-
.Event_BallBounce => {
202+
.BallBounce => {
188203
self.rumbleGamepad(0.25, 0.25, 150);
189204
},
205+
.Options_TestRumble => {
206+
self.rumbleGamepad(1.0, 1.0, 100);
207+
},
190208
}
191209
}
192210
};

src/objects.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ void shock(TITUS_level *level,
424424
}
425425

426426
// Hit!
427-
playEvent_c(Event_PlayerHeadImpact);
427+
playc(PlayerHeadImpact);
428428
CHOC_FLAG = 24;
429429
if (object->sprite.killing) {
430430
if (!GODMODE) {

src/objects.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ fn shock(level: *lvl.Level, object: *lvl.Object) void {
322322
} else {
323323
if (((@as(c_int, @bitCast(@as(c_int, object.sprite.y))) - @as(c_int, @bitCast(@as(c_uint, object.sprite.spritedata.?.collheight)))) + @as(c_int, 1)) >= @as(c_int, @bitCast(@as(c_int, player.sprite.y)))) return;
324324
}
325-
events.triggerEvent(.Event_PlayerHeadImpact);
325+
events.triggerEvent(.PlayerHeadImpact);
326326
globals.CHOC_FLAG = 24;
327327
if (object.*.sprite.killing) {
328328
if (!globals.GODMODE) {

src/player.zig

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,7 @@ fn collect_bonus(level: *lvl.Level, tileY: i16, tileX: i16) bool {
896896

897897
if (bonus.bonustile >= (255 - 2)) {
898898
level.bonuscollected += 1;
899-
events.triggerEvent(.Event_PlayerCollectBonus);
899+
events.triggerEvent(.PlayerCollectBonus);
900900
INC_ENERGY(level);
901901
}
902902
level.setTile(@intCast(tileX), @intCast(tileY), bonus.replacetile);
@@ -915,15 +915,15 @@ fn collect_level_unlock(level: *lvl.Level, level_index: u8, tileY: i16, tileX: i
915915
game_state.unlock_level(allocator, level_index, level.lives) catch |err| {
916916
std.log.err("Failed to save progression: {s}", .{ @errorName(err) });
917917
};
918-
events.triggerEvent(.Event_PlayerCollectLamp);
918+
events.triggerEvent(.PlayerCollectLamp);
919919
}
920920

921921
fn collect_checkpoint(level: *lvl.Level, tileY: i16, tileX: i16) void {
922922
if (!collect_bonus(level, tileY, tileX))
923923
return;
924924

925925
const player = &level.player;
926-
events.triggerEvent(.Event_PlayerCollectWaypoint);
926+
events.triggerEvent(.PlayerCollectWaypoint);
927927
player.initX = player.sprite.x;
928928
player.initY = player.sprite.y;
929929
// carrying cage?
@@ -988,7 +988,7 @@ fn ACTION_PRG(level: *lvl.Level, action: PlayerAction) void {
988988
.Jump, .Jump_Carry => {
989989
// Handle a jump
990990
if (globals.jump_acceleration_counter == 0) {
991-
events.triggerEvent(.Event_PlayerJump);
991+
events.triggerEvent(.PlayerJump);
992992
}
993993
if (globals.jump_acceleration_counter >= 3) {
994994
globals.jump_timer = 6; // Stop jump animation and acceleration
@@ -1143,7 +1143,7 @@ fn ACTION_PRG(level: *lvl.Level, action: PlayerAction) void {
11431143
}
11441144

11451145
// Take the object
1146-
events.triggerEvent(.Event_PlayerPickup);
1146+
events.triggerEvent(.PlayerPickup);
11471147
globals.FUME_FLAG = 0;
11481148
object.sprite.speed_y = 0;
11491149
object.sprite.speed_x = 0;
@@ -1219,7 +1219,7 @@ fn ACTION_PRG(level: *lvl.Level, action: PlayerAction) void {
12191219
}
12201220
}
12211221

1222-
events.triggerEvent(.Event_PlayerPickupEnemy);
1222+
events.triggerEvent(.PlayerPickupEnemy);
12231223
globals.FUME_FLAG = 0;
12241224
enemy.sprite.speed_y = 0;
12251225
enemy.sprite.speed_x = 0;
@@ -1279,19 +1279,19 @@ fn ACTION_PRG(level: *lvl.Level, action: PlayerAction) void {
12791279
if (player_drop_carried(level)) |object| {
12801280
object.*.sprite.speed_y = speed_y;
12811281
object.*.sprite.speed_x = speed_x - (speed_x >> 2);
1282-
events.triggerEvent(.Event_PlayerThrow);
1282+
events.triggerEvent(.PlayerThrow);
12831283
}
12841284
} else { // Ordinary throw
12851285
globals.DROP_FLAG = true;
12861286
player.sprite2.speed_x = speed_x;
12871287
player.sprite2.speed_y = speed_y;
1288-
events.triggerEvent(.Event_PlayerThrow);
1288+
events.triggerEvent(.PlayerThrow);
12891289
}
12901290
} else { // Ordinary throw
12911291
globals.DROP_FLAG = true;
12921292
player.sprite2.speed_x = speed_x;
12931293
player.sprite2.speed_y = speed_y;
1294-
events.triggerEvent(.Event_PlayerThrow);
1294+
events.triggerEvent(.PlayerThrow);
12951295
}
12961296
}
12971297
sprites.updatesprite(level, &player.sprite, 10, true); // The same as in free fall
@@ -1505,7 +1505,7 @@ fn player_collide_with_objects(level: *lvl.Level) void {
15051505

15061506
// If the ball lies on the ground
15071507
if (off_object.sprite.speed_y == 0) {
1508-
events.triggerEvent(.Event_BallBounce);
1508+
events.triggerEvent(.BallBounce);
15091509
off_object.sprite.speed_y = 0 - player.sprite.speed_y;
15101510
off_object.sprite.y -= off_object.sprite.speed_y >> 4;
15111511
globals.GRAVITY_FLAG = 4;

src/settings.zig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ pub const Settings = extern struct {
5050
window_height: u16 = window.game_height * 3,
5151
audio_backend: BackendType = .Adlib,
5252
input_mode: InputMode = .Modern,
53+
rumble: u8 = 8, // 0 = off, 16 = max
5354
seen_intro: bool = false,
5455

5556
pub fn make_new(allocator: Allocator) !ManagedJSON(Settings) {
@@ -110,6 +111,9 @@ pub const Settings = extern struct {
110111
if (settings.volume_master > 128) {
111112
settings.volume_master = 128;
112113
}
114+
if (settings.rumble > 16) {
115+
settings.rumble = 16;
116+
}
113117
if (settings.window_width < window.game_width) {
114118
settings.window_width = window.game_width;
115119
}

0 commit comments

Comments
 (0)