فهرست منبع

Implement country race rule set

Kirk Trombley 4 سال پیش
والد
کامیت
7d98436bdf
3فایلهای تغییر یافته به همراه24 افزوده شده و 3 حذف شده
  1. 11 3
      server/app/api/game.py
  2. 1 0
      server/app/schemas.py
  3. 12 0
      server/app/scoring.py

+ 11 - 3
server/app/api/game.py

@@ -5,7 +5,7 @@ from pydantic import conint, constr
 from sqlalchemy.orm import Session
 
 from .. import scoring
-from ..schemas import GameConfig, Guess
+from ..schemas import GameConfig, Guess, RuleSetEnum
 from ..db import get_db, queries, models
 from ..point_gen import generate_points, restock_source, ExhaustedSourceError
 
@@ -136,9 +136,17 @@ def get_first_submitter(game_id: str, round_number: conint(gt=0), db: Session =
 
 
 @router.post("/{game_id}/round/{round_number}/guess/{player_id}", response_model=GuessResult)
-def submit_guess(round_number: conint(gt=0), guess: Guess, db: Session = Depends(get_db), player: models.Player = Depends(get_player)):
+def submit_guess(round_number: conint(gt=0), 
+                 guess: Guess, 
+                 db: Session = Depends(get_db), 
+                 game: models.Game = Depends(get_game), 
+                 player: models.Player = Depends(get_player)):
     target = queries.get_coordinate(db, player.game_id, round_number)
-    score, distance = scoring.score((target.latitude, target.longitude), (guess.lat, guess.lng))
+    if game.rule_set == RuleSetEnum.country_race:
+        score = scoring.score_country_race(target.country_code, guess.country, guess.time_remaining, game.timer)
+        distance = None
+    else:
+        score, distance = scoring.score((target.latitude, target.longitude), (guess.lat, guess.lng))
     added = queries.add_guess(db, guess, player, round_number, score)
     if not added:
         raise HTTPException(status_code=409, detail="Already submitted guess for this round")

+ 1 - 0
server/app/schemas.py

@@ -19,6 +19,7 @@ class RuleSetEnum(str, Enum):
     time_bank = "TIMEBANK"
     frozen = "FROZEN"
     race = "RACE"
+    country_race = "COUNTRYRACE"
 
 
 class GameConfig(CamelModel):

+ 12 - 0
server/app/scoring.py

@@ -66,3 +66,15 @@ def score(target: Tuple[float, float], guess: Tuple[float, float]) -> Tuple[int,
         point_score = 0
 
     return point_score, dist_km
+
+
+def score_country_race(target: str, guess: str, time_remaining: int, time_total: int):
+    if target != guess:
+        return 0
+
+    time_used = time_total - time_remaining
+    if time_used <= 5:
+        return 5000
+    
+    # TODO make this into an interesting curve but for now linear is fine
+    return 5000 * (time_remaining / time_total)