Skip to content

Commit

Permalink
Set OS Offset when applicable
Browse files Browse the repository at this point in the history
add rule to disable
allow editing in frontend
  • Loading branch information
frank-weinberg committed Dec 27, 2021
1 parent e61fd77 commit 489ae9d
Show file tree
Hide file tree
Showing 11 changed files with 112 additions and 10 deletions.
3 changes: 2 additions & 1 deletion .jshintrc
Expand Up @@ -3,7 +3,7 @@
"unused": false,
"laxbreak": true,
"browser": true,
"devel": true,
"devel": false,
"curly": true,
"esversion": 5,
"shadow": "outer",
Expand All @@ -22,6 +22,7 @@
"prepareLtSheetTable": true,
"preparePltInputTable": true,
"prepareTripEditor": true,
"prepareOsOffsetEditor": true,
"prepareAnnotationEditor": true,
"preparePenaltyEditor": true,
"prepareFieldingEditor": true,
Expand Down
2 changes: 2 additions & 0 deletions html/components/sheets-tab.js
Expand Up @@ -39,6 +39,7 @@ function createSheetsTab(tab, gameId) {
var pt2 = $('<div>').addClass('T2 PTS Sheet Hide').appendTo(tab);
$('<div>').attr('id', 'TripEditor').appendTo(tab);
$('<div>').attr('id', 'skaterSelector').appendTo(tab);
$('<div>').attr('id', 'osOffsetEditor').appendTo(tab);
$('<div>').attr('id', 'PenaltyEditor').appendTo(tab);
var ae1 = $('<div>').attr('id', 'AnnotationEditor1').appendTo(tab);
var ae2 = $('<div>').attr('id', 'AnnotationEditor2').appendTo(tab);
Expand All @@ -52,6 +53,7 @@ function createSheetsTab(tab, gameId) {
prepareLtSheetTable(lt2, gameId, '2', 'edit');
prepareTripEditor();
prepareSkaterSelector(gameId);
prepareOsOffsetEditor();
preparePenaltyEditor(gameId);
prepareAnnotationEditor(ae1, gameId, '1');
prepareAnnotationEditor(ae2, gameId, '2');
Expand Down
11 changes: 7 additions & 4 deletions html/components/sk-sheet.css
@@ -1,6 +1,6 @@
.SK, #TripEditor {font-size: 11pt;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif; }
table.SK, .SK .table, .SK tr, .SK td, #TripEditor table, #TripEditor tr, #TripEditor td {border-collapse: collapse;border-color:#777; }
body:not(.AllowSelect) .SK {user-select: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-o-user-select: none; }
.SK, #TripEditor { font-size: 11pt; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif; }
table.SK, .SK .table, .SK tr, .SK td, #TripEditor table, #TripEditor tr, #TripEditor td { border-collapse: collapse; border-color:#777; }
body:not(.AllowSelect) .SK { user-select: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -o-user-select: none; }
.SK tr { color: #333; }
.SK .Hide { display: none; }
.SK.Period { width: 98%; table-layout:fixed; margin: 1%; }
Expand All @@ -21,7 +21,7 @@ body:not(.AllowSelect) .SK {user-select: none;-webkit-user-select: none;-khtml-u
.SK.Period #head { font-size: 200%; }
.SK.Period .Trip, .Period .JamTotal, .Period .GameTotal { width: 9%; }
.SK.Period .GameTotal, .SK.Period .JamTotal,.SK.Period .Lost, .SK.Period .Trip2 { border-left-width: 2px; }
.SK.Period .GameTotal { background-color: #d3ecb6; }
.SK.Period tr .GameTotal { background-color: #d3ecb6; }
.SK.Period .hasAnnotation { position: relative; }
.SK.Period .hasAnnotation::after { position: absolute; right: 2px; top: 2px; height: 5px; width: 5px; background-color: red; content: ""; }

Expand All @@ -37,5 +37,8 @@ body:not(.AllowSelect) .SK {user-select: none;-webkit-user-select: none;-khtml-u

#skaterSelector .Hide { display: none; }

#osOffsetEditor .Offset { width: 40px; }
#osOffsetEditor .Reason { margin: 0px 5px; }

.SK.Period .noTripAlert { position: relative; }
.SK.Period .noTripAlert::after { position: absolute; right: 2px; top: 2px; height: 5px; width: 5px; background-color: red; content: ""; }
50 changes: 49 additions & 1 deletion html/components/sk-sheet.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions html/components/team-time-tab.js
Expand Up @@ -30,10 +30,12 @@ function createTeamTimeTab(tab, gameId) {
var sk2 = $('<div>').addClass('SKSheet').appendTo(tab);
$('<div>').attr('id', 'TripEditor').appendTo(tab);
$('<div>').attr('id', 'skaterSelector').appendTo(tab);
$('<div>').attr('id', 'osOffsetEditor').appendTo(tab);
prepareSkSheetTable(sk1, gameId, 1, 'operator');
prepareSkSheetTable(sk2, gameId, 2, 'operator');
prepareTripEditor();
prepareSkaterSelector(gameId);
prepareOsOffsetEditor();

initialLogin();
}
Expand Down
2 changes: 2 additions & 0 deletions src/com/carolinarollergirls/scoreboard/core/game/JamImpl.java
Expand Up @@ -5,6 +5,7 @@
import com.carolinarollergirls.scoreboard.core.interfaces.Jam;
import com.carolinarollergirls.scoreboard.core.interfaces.Penalty;
import com.carolinarollergirls.scoreboard.core.interfaces.Period;
import com.carolinarollergirls.scoreboard.core.interfaces.ScoringTrip;
import com.carolinarollergirls.scoreboard.core.interfaces.Team;
import com.carolinarollergirls.scoreboard.core.interfaces.TeamJam;
import com.carolinarollergirls.scoreboard.core.interfaces.Timeout;
Expand Down Expand Up @@ -160,6 +161,7 @@ public void stop() {
set(PERIOD_CLOCK_ELAPSED_END, game.getClock(Clock.ID_PERIOD).getTimeElapsed());
set(PERIOD_CLOCK_DISPLAY_END, game.getClock(Clock.ID_PERIOD).getTime());
set(WALLTIME_END, ScoreBoardClock.getInstance().getCurrentWalltime());
for (TeamJam tj : getAll(TEAM_JAM)) { tj.getCurrentScoringTrip().set(ScoringTrip.CURRENT, false); }
}
}

Expand Down
Expand Up @@ -8,6 +8,7 @@
import com.carolinarollergirls.scoreboard.event.NumberedScoreBoardEventProviderImpl;
import com.carolinarollergirls.scoreboard.event.ScoreBoardEventProvider;
import com.carolinarollergirls.scoreboard.event.Value;
import com.carolinarollergirls.scoreboard.rules.Rule;

public class ScoringTripImpl extends NumberedScoreBoardEventProviderImpl<ScoringTrip> implements ScoringTrip {
ScoringTripImpl(TeamJam parent, int number) {
Expand Down Expand Up @@ -46,6 +47,21 @@ public void valueChanged(Value<?> prop, Object value, Object last, Source source
if ((prop == SCORE || (prop == CURRENT && !(Boolean) value)) && get(JAM_CLOCK_END) == 0L) {
set(JAM_CLOCK_END, game.getClock(Clock.ID_JAM).getTimeElapsed());
}
if (prop == SCORE && source == Source.WS && game.getBoolean(Rule.WFTDA_LATE_SCORE_RULE)) {
TeamJam tj = (TeamJam) parent;
boolean nextJamNotStarted = tj.getJam() == game.getCurrentPeriod().getCurrentJam();
boolean nextJamNotEnded =
nextJamNotStarted ||
(game.getCurrentPeriod().getCurrentJam() == tj.getJam().getNext() && game.isInJam());
boolean lastTwoMinutes = (game.getClock(Clock.ID_PERIOD).getTimeRemaining() < 120000 ||
game.getCurrentPeriodNumber() == game.getInt(Rule.NUMBER_PERIODS));
boolean changeOk = ((!lastTwoMinutes && nextJamNotEnded) || (lastTwoMinutes && nextJamNotStarted)) &&
!game.isOfficialScore();
if (!changeOk) {
int change = (Integer) value - (Integer) last;
tj.set(TeamJam.OS_OFFSET, -change, Flag.CHANGE);
}
}
if (prop == CURRENT && (Boolean) value && get(SCORE) == 0) { set(JAM_CLOCK_END, 0L); }
if (prop == AFTER_S_P) {
if ((Boolean) value && hasNext()) { getNext().set(AFTER_S_P, true); }
Expand Down
Expand Up @@ -46,7 +46,7 @@ public interface TeamJam extends ParentOrderedScoreBoardEventProvider<TeamJam> {
Value<Integer> CURRENT_TRIP_NUMBER = new Value<>(Integer.class, "CurrentTripNumber", 0);
Value<Integer> LAST_SCORE = new Value<>(Integer.class, "LastScore", 0);
Value<Integer> OS_OFFSET = new Value<>(Integer.class, "OsOffset", 0);
Value<Integer> OS_OFFSET_REASON = new Value<>(Integer.class, "OsOffsetReason", 0);
Value<String> OS_OFFSET_REASON = new Value<>(String.class, "OsOffsetReason", "");
Value<Integer> JAM_SCORE = new Value<>(Integer.class, "JamScore", 0);
Value<Integer> AFTER_S_P_SCORE = new Value<>(Integer.class, "AfterSPScore", 0);
Value<Integer> TOTAL_SCORE = new Value<>(Integer.class, "TotalScore", 0);
Expand Down
Expand Up @@ -66,7 +66,7 @@ private void initialize() {
}

private void addDefaultRulesets(Ruleset root) {
RulesetImpl sevens = new RulesetImpl(this, "Sevens", root, "Sevens");
RulesetImpl sevens = new RulesetImpl(this, "Sevens", root, "SevensRuleset");
sevens.setRule("Intermission.Durations", "60:00");
sevens.setRule("Penalties.NumberToFoulout", "4");
sevens.setRule("Period.Duration", "21:00");
Expand All @@ -85,10 +85,11 @@ private void addDefaultRulesets(Ruleset root) {
rdcl.setRule("Period.EndBetweenJams", "false");
rdcl.setRule("Period.Number", "4");
rdcl.setRule("Team.RDCLPerHalfRules", "true");
rdcl.setRule("Score.WftdaLateChangeRule", "false");
rdcl.set(READONLY, true);
add(RULESET, rdcl);

RulesetImpl rdclHalf = new RulesetImpl(this, "RDCL half game", root, "RDCLHalfGameRuleset");
RulesetImpl rdclHalf = new RulesetImpl(this, "RDCL half game", rdcl, "RDCLHalfGameRuleset");
rdclHalf.setRule("Intermission.Durations", "5:00,60:00");
rdclHalf.setRule("Penalties.NumberToFoulout", "4");
rdclHalf.setRule("Period.Number", "2");
Expand Down
6 changes: 5 additions & 1 deletion src/com/carolinarollergirls/scoreboard/rules/Rule.java
Expand Up @@ -80,7 +80,11 @@ public enum Rule {
FO_LIMIT(new IntegerRule(
"Penalties.NumberToFoulout",
"After how many penalties a skater has fouled out of the game. Note that the software currently does not support more than 9 penalties per skater.",
7));
7)),
WFTDA_LATE_SCORE_RULE(new BooleanRule(
"Score.WftdaLateChangeRule",
"Score changes after the end of the following jam don't affect the game score. With less than 2 minutes left in the game this applies to changes after the next jam starts.",
true, "Enabled", "Disabled"));

private Rule(RuleDefinition r) { rule = r; }

Expand Down
Expand Up @@ -12,13 +12,16 @@

import com.carolinarollergirls.scoreboard.core.ScoreBoardImpl;
import com.carolinarollergirls.scoreboard.core.interfaces.CurrentGame;
import com.carolinarollergirls.scoreboard.core.interfaces.Game;
import com.carolinarollergirls.scoreboard.core.interfaces.Jam;
import com.carolinarollergirls.scoreboard.core.interfaces.ScoreBoard;
import com.carolinarollergirls.scoreboard.core.interfaces.ScoringTrip;
import com.carolinarollergirls.scoreboard.core.interfaces.Team;
import com.carolinarollergirls.scoreboard.core.interfaces.TeamJam;
import com.carolinarollergirls.scoreboard.event.ScoreBoardEvent;
import com.carolinarollergirls.scoreboard.event.ScoreBoardEventProvider.Source;
import com.carolinarollergirls.scoreboard.event.ScoreBoardListener;
import com.carolinarollergirls.scoreboard.rules.Rule;
import com.carolinarollergirls.scoreboard.utils.ScoreBoardClock;

public class TeamJamImplTests {
Expand Down Expand Up @@ -90,4 +93,24 @@ public void testNoLostInOvertime() {
tj.set(TeamJam.LOST, true);
assertFalse(tj.isLost());
}

@Test
public void testLateScoreChange() {
Game g = sb.getCurrentGame().get(CurrentGame.GAME);
g.startJam();
tj.getTeam().execute(Team.ADD_TRIP);
tj.getCurrentScoringTrip().set(ScoringTrip.SCORE, 2);
g.stopJamTO();
g.startJam();
g.stopJamTO();
tj.getCurrentScoringTrip().set(ScoringTrip.SCORE, 3, Source.WS);
assertEquals(-1, tj.getOsOffset());

tj.getCurrentScoringTrip().set(ScoringTrip.SCORE, 0, Source.WS);
assertEquals(2, tj.getOsOffset());

g.set(Rule.WFTDA_LATE_SCORE_RULE, String.valueOf(false));
tj.getCurrentScoringTrip().set(ScoringTrip.SCORE, 2, Source.WS);
assertEquals(2, tj.getOsOffset());
}
}

0 comments on commit 489ae9d

Please sign in to comment.