Skip to content

Commit 874fb4d

Browse files
committed
Force Applies on Button Press
1 parent d2df0f2 commit 874fb4d

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

fission/src/systems/input/DefaultInputs.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class DefaultInputs {
2626

2727
ButtonInput.onKeyboard("intake", "KeyE"),
2828
ButtonInput.onKeyboard("eject", "KeyQ"),
29+
ButtonInput.onKeyboard("unstick", "Space"),
2930

3031
AxisInput.onKeyboardSingleKey("joint 1", "Digit1", negativeModifierKeys),
3132
AxisInput.onKeyboardSingleKey("joint 2", "Digit2", negativeModifierKeys),
@@ -61,6 +62,7 @@ class DefaultInputs {
6162

6263
ButtonInput.onKeyboard("intake", "KeyE"),
6364
ButtonInput.onKeyboard("eject", "KeyQ"),
65+
ButtonInput.onKeyboard("unstick", "Space"),
6466

6567
AxisInput.onKeyboardSingleKey("joint 1", "Digit1", negativeModifierKeys),
6668
AxisInput.onKeyboardSingleKey("joint 2", "Digit2", negativeModifierKeys),
@@ -96,6 +98,7 @@ class DefaultInputs {
9698

9799
ButtonInput.onKeyboard("intake", "Semicolon"),
98100
ButtonInput.onKeyboard("eject", "KeyL"),
101+
ButtonInput.onKeyboard("unstick", "KeyK"),
99102

100103
AxisInput.onKeyboardSingleKey("joint 1", "Slash", negativeModifierKeys),
101104
AxisInput.onKeyboardSingleKey("joint 2", "Period", negativeModifierKeys),
@@ -127,6 +130,7 @@ class DefaultInputs {
127130

128131
ButtonInput.onGamepad("intake", 4),
129132
ButtonInput.onGamepad("eject", 5),
133+
ButtonInput.onGamepad("unstick", 6),
130134

131135
AxisInput.onGamepadButtons("joint 1", 3, 0),
132136
AxisInput.onGamepadButtons("joint 2", 1, 2),
@@ -157,6 +161,7 @@ class DefaultInputs {
157161

158162
ButtonInput.onGamepad("intake", 4),
159163
ButtonInput.onGamepad("eject", 5),
164+
ButtonInput.onGamepad("unstick", 6),
160165

161166
AxisInput.onGamepadButtons("joint 1", 12, 13),
162167
AxisInput.onGamepadButtons("joint 2", 15, 14),
@@ -186,6 +191,7 @@ class DefaultInputs {
186191

187192
ButtonInput.onGamepad("intake", 4),
188193
ButtonInput.onGamepad("eject", 5),
194+
ButtonInput.onGamepad("unstick", 6),
189195

190196
AxisInput.onGamepadButtons("joint 1", 3, 0),
191197
AxisInput.onGamepadButtons("joint 2", 1, 2),
@@ -254,6 +260,7 @@ class DefaultInputs {
254260

255261
ButtonInput.unbound("intake"),
256262
ButtonInput.unbound("eject"),
263+
ButtonInput.unbound("unstick"),
257264

258265
AxisInput.unbound("joint 1"),
259266
AxisInput.unbound("joint 2"),

fission/src/systems/input/InputSystem.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export type ModifierState = Readonly<{
1414
}>
1515
export const EMPTY_MODIFIER_STATE: ModifierState = { ctrl: false, alt: false, shift: false, meta: false }
1616

17-
export type InputName = "arcadeDrive" | "arcadeTurn" | "tankLeft" | "tankRight" | "intake" | "eject" | `joint ${number}`
17+
export type InputName = "arcadeDrive" | "arcadeTurn" | "tankLeft" | "tankRight" | "intake" | "eject" | "unstick" | `joint ${number}`
1818

1919
const inputDriveTypeAssociations: Partial<Record<InputName, DriveType>> = {
2020
arcadeDrive: DriveType.ARCADE,

fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ class SynthesisBrain extends Brain {
3535
// Tracks how many joins have been made with unique controls
3636
private _currentJointIndex = 1
3737

38+
// Track previous unstick button state to detect button press (not hold)
39+
private _prevUnstickPressed = false
40+
3841
public get assemblyName(): string {
3942
return this._assemblyName
4043
}
@@ -112,6 +115,36 @@ class SynthesisBrain extends Brain {
112115

113116
this._assembly.ejectorActive = InputSystem.getInput("eject", this._brainIndex) > 0.5
114117
this._assembly.intakeActive = InputSystem.getInput("intake", this._brainIndex) > 0.5
118+
119+
// Handle unstick
120+
const unstickPressed = InputSystem.getInput("unstick", this._brainIndex) === 1
121+
if (unstickPressed && !this._prevUnstickPressed) {
122+
this.applyUnstickForce()
123+
}
124+
125+
this._prevUnstickPressed = unstickPressed
126+
}
127+
128+
/**
129+
* Applies a small upward force to the robot's main body to help unstick it
130+
*/
131+
private applyUnstickForce(): void {
132+
const rootBodyId = this._mechanism.getBodyByNodeId(this._mechanism.rootBody)
133+
if (!rootBodyId) {
134+
console.warn("Could not find root body for unstick")
135+
return
136+
}
137+
138+
const body = World.physicsSystem.getBody(rootBodyId)
139+
if (!body) {
140+
console.warn("Could not get body for unstick")
141+
return
142+
}
143+
144+
const unstickForce = new JOLT.Vec3(0, 8000, 0)
145+
body.AddForce(unstickForce)
146+
147+
console.log("Unstick force applied to robot")
115148
}
116149

117150
public disable(): void {

0 commit comments

Comments
 (0)