Skip to content

Commit 6bcdc5a

Browse files
committed
Add support for "My Ball" skill
1 parent 4f974bd commit 6bcdc5a

File tree

5 files changed

+93
-3
lines changed

5 files changed

+93
-3
lines changed

docs/bb2025/todo-skills-bb2025.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,10 @@ a test class in `modules/jervis-engine/src/commonTest/kotlin/dk/ilios/jervis/bb2
208208
- [ ] Hypnotic Gaze
209209
- [ ] Kick Team-mate
210210
- [ ] Loner (X+)*
211+
- [ ] My Ball*
212+
- [x] Cannot Pass
213+
- [x] Cannot Hand-off
214+
- [ ] Cannot Fumblerooskie
211215
- [ ] No Ball*
212216
- [ ] Plague Ridden
213217
- [ ] Pogo Stick

modules/jervis-engine/src/commonMain/kotlin/com/jervisffb/engine/rules/bb2025/BB2025SkillSettings.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.jervisffb.engine.rules.bb2025.skills.Leap
2424
import com.jervisffb.engine.rules.bb2025.skills.Loner
2525
import com.jervisffb.engine.rules.bb2025.skills.MightyBlow
2626
import com.jervisffb.engine.rules.bb2025.skills.MultipleBlock
27+
import com.jervisffb.engine.rules.bb2025.skills.MyBall
2728
import com.jervisffb.engine.rules.bb2025.skills.Pass
2829
import com.jervisffb.engine.rules.bb2025.skills.PrehensileTail
2930
import com.jervisffb.engine.rules.bb2025.skills.Pro
@@ -535,7 +536,9 @@ class BB2025SkillSettings: SkillSettings() {
535536
}
536537
}
537538
SkillType.MY_BALL -> {
538-
// TODO()
539+
addNoValueEntry("My Ball", type, SkillCategory.TRAITS) { player, category,expiresAt ->
540+
MyBall(player, category, expiresAt)
541+
}
539542
}
540543
SkillType.NO_BALL -> {
541544
// TODO
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.jervisffb.engine.rules.bb2025.skills
2+
3+
import com.jervisffb.engine.model.Player
4+
import com.jervisffb.engine.model.SkillId
5+
import com.jervisffb.engine.model.SkillKeyword
6+
import com.jervisffb.engine.rules.common.skills.Duration
7+
import com.jervisffb.engine.rules.common.skills.SkillCategory
8+
import com.jervisffb.engine.rules.common.skills.SkillType
9+
10+
/**
11+
* Represents the "My Ball* (Passive)" skill.
12+
*
13+
* See page 132 in the BB2025 rulebook.
14+
*/
15+
class MyBall(
16+
override val player: Player,
17+
override val category: SkillCategory = SkillCategory.TRAITS,
18+
override val expiresAt: Duration = Duration.PERMANENT,
19+
) : BB2025Skill {
20+
override val type: SkillType = SkillType.MY_BALL
21+
override val value: Unit? = null
22+
override val skillId: SkillId = type.id(value)
23+
override val name: String = type.description
24+
override val compulsory: Boolean = true
25+
override val resetAt: Duration = Duration.PERMANENT
26+
override var used: Boolean = false
27+
override val workWithoutTackleZones: Boolean = true
28+
override val workWhenProne: Boolean = true
29+
override val keywords: List<SkillKeyword> = listOf(SkillKeyword.PASSIVE)
30+
}

modules/jervis-engine/src/commonMain/kotlin/com/jervisffb/engine/rules/bb2025rules.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,12 @@ abstract class BB2025Rules(
4343
// Add any team actions that are available
4444
state.activeTeamOrThrow().turnData.let { turnData ->
4545
if (turnData.moveActions > 0) add(teamActions.move)
46-
if (turnData.passActions > 0) add(teamActions.pass)
47-
if (turnData.handOffActions > 0) add(teamActions.handOff)
46+
if (turnData.passActions > 0 && !player.isSkillAvailable(SkillType.MY_BALL)) {
47+
add(teamActions.pass)
48+
}
49+
if (turnData.handOffActions > 0 && !player.isSkillAvailable(SkillType.MY_BALL)) {
50+
add(teamActions.handOff)
51+
}
4852
if (turnData.blockActions > 0) {
4953
val isStanding = (player.state == PlayerState.STANDING)
5054
val hasEligibleTargets = (player.location as OnFieldLocation)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.jervisffb.test.bb2025.skills
2+
3+
import com.jervisffb.engine.actions.PlayerSelected
4+
import com.jervisffb.engine.actions.SelectPlayerAction
5+
import com.jervisffb.engine.ext.playerId
6+
import com.jervisffb.engine.rules.bb2025.skills.MyBall
7+
import com.jervisffb.engine.rules.common.actions.PlayerStandardActionType
8+
import com.jervisffb.engine.rules.common.skills.SkillType
9+
import com.jervisffb.test.JervisGameBB2025Test
10+
import com.jervisffb.test.ext.rollForward
11+
import kotlin.test.BeforeTest
12+
import kotlin.test.Ignore
13+
import kotlin.test.Test
14+
import kotlin.test.assertTrue
15+
16+
/**
17+
* Class testing usage of the [MyBall] skill.
18+
*/
19+
class MyBallTests: JervisGameBB2025Test() {
20+
21+
@BeforeTest
22+
override fun setUp() {
23+
super.setUp()
24+
startDefaultGame()
25+
awayTeam["A1".playerId].addSkill(SkillType.MY_BALL)
26+
}
27+
28+
@Test
29+
fun cannotDeclarePassAction() {
30+
controller.rollForward(
31+
PlayerSelected("A1".playerId),
32+
)
33+
assertTrue(controller.getAvailableActions().get<SelectPlayerAction>().actions.none { it.type == PlayerStandardActionType.PASS })
34+
}
35+
36+
@Test
37+
fun cannotDeclareHandOffAction() {
38+
controller.rollForward(
39+
PlayerSelected("A1".playerId),
40+
)
41+
assertTrue(controller.getAvailableActions().get<SelectPlayerAction>().actions.none { it.type == PlayerStandardActionType.HAND_OFF })
42+
}
43+
44+
@Ignore
45+
@Test
46+
fun cannotUseFumblerooskie() {
47+
// Add test when Fumblerooskie is implemented
48+
}
49+
}

0 commit comments

Comments
 (0)