aboutsummaryrefslogtreecommitdiff
path: root/internal/game/act_agility.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-07 21:22:39 -0400
committerhistoria <[not public]>2026-07-07 21:22:39 -0400
commit74803657d587b1f93b739c1ee25bb8d62df95413 (patch)
tree0166974468c452bb13454d37d4b83d2e681446c0 /internal/game/act_agility.go
parentbae42946d24bd533cdbc1b271ce14acd752689d0 (diff)
downloadthehouseoficarus-74803657d587b1f93b739c1ee25bb8d62df95413.tar.gz
fix: agility course creation fixed and improved in admin web gui
Diffstat (limited to 'internal/game/act_agility.go')
-rw-r--r--internal/game/act_agility.go104
1 files changed, 60 insertions, 44 deletions
diff --git a/internal/game/act_agility.go b/internal/game/act_agility.go
index 18dbf4a..a243b44 100644
--- a/internal/game/act_agility.go
+++ b/internal/game/act_agility.go
@@ -44,6 +44,7 @@ func (g *Game) startObstacle(sess *net.Session, p *player.Player, info *Obstacle
TotalObstacles: info.TotalObstacles,
NextRoom: info.NextRoom,
StartRoom: info.StartRoom,
+ OnFailRoom: info.OnFailRoom,
ObstacleXP: info.ObstacleXP,
CompletionXP: info.CompletionXP,
FailChance: failPtr,
@@ -62,6 +63,11 @@ func (g *Game) advanceObstacle(sess *net.Session, p *player.Player) {
phase := d.Phase
phases := d.Phases
+ if len(phases) == 0 {
+ g.completeObstacle(sess, p, d)
+ return
+ }
+
if phase >= len(phases) {
g.cancelAction(p)
return
@@ -84,58 +90,61 @@ func (g *Game) advanceObstacle(sess *net.Session, p *player.Player) {
nextPhase := phase + 1
if nextPhase >= len(phases) {
- obstacleXP := d.ObstacleXP
- completionXP := d.CompletionXP
- nextRoom := d.NextRoom
- startRoom := d.StartRoom
- obstacleIndex := d.ObstacleIndex
- totalObstacles := d.TotalObstacles
- courseID := d.CourseID
-
- if obstacleXP > 0 {
- g.awardSkillXP(sess, p, player.Agility, obstacleXP)
- if p.OptionBool("xp_drops") {
- sess.WriteLine(g.colorize(sess, "xp",
- fmt.Sprintf("(+%dxp %s)", obstacleXP, player.SkillAbbr[player.Agility])))
- }
+ g.completeObstacle(sess, p, d)
+ return
+ }
+
+ d.Phase = nextPhase
+ p.Action.WaitLeft = engine.ToTicks(phases[nextPhase].Delay)
+}
+
+func (g *Game) completeObstacle(sess *net.Session, p *player.Player, d *behavior.ObstacleData) {
+ obstacleXP := d.ObstacleXP
+ completionXP := d.CompletionXP
+ nextRoom := d.NextRoom
+ obstacleIndex := d.ObstacleIndex
+ totalObstacles := d.TotalObstacles
+ courseID := d.CourseID
+
+ isLastObstacle := obstacleIndex == totalObstacles-1
+
+ if obstacleXP > 0 {
+ g.awardSkillXP(sess, p, player.Agility, obstacleXP)
+ if !isLastObstacle && p.OptionBool("xp_drops") {
+ sess.WriteLine(g.colorize(sess, "xp",
+ fmt.Sprintf("(+%dxp %s)", obstacleXP, player.SkillAbbr[player.Agility])))
}
+ }
- isLastObstacle := obstacleIndex == totalObstacles-1
-
- if isLastObstacle {
- if completionXP > 0 {
- g.awardSkillXP(sess, p, player.Agility, completionXP)
- if p.OptionBool("xp_drops") {
- sess.WriteLine(g.colorize(sess, "xp",
- fmt.Sprintf("(+%dxp %s course bonus)", completionXP, player.SkillAbbr[player.Agility])))
- }
- }
-
- lapKey := "agility_laps_" + courseID
- laps := getPlayerFlagInt(p, lapKey) + 1
- g.setPlayerFlag(p, lapKey, laps)
-
- courseName := p.Action.TargetName
- sess.WriteLine(g.colorize(sess, "broadcast",
- fmt.Sprintf("Course complete! %s lap %d finished.", courseName, laps)))
-
- g.cancelAction(p)
- g.teleportPlayer(sess, p, startRoom)
- } else {
- g.cancelAction(p)
- g.teleportPlayer(sess, p, nextRoom)
+ if isLastObstacle {
+ if completionXP > 0 {
+ g.awardSkillXP(sess, p, player.Agility, completionXP)
}
- g.AccountStore.SaveCharacter(p)
- return
+ lapKey := "agility_laps_" + courseID
+ laps := getPlayerFlagInt(p, lapKey) + 1
+ g.setPlayerFlag(p, lapKey, laps)
+
+ courseName := p.Action.TargetName
+ msg := fmt.Sprintf("You've completed %d lap%s of %s", laps, pluralLap(laps), courseName)
+ combinedXP := obstacleXP + completionXP
+ if p.OptionBool("xp_drops") && combinedXP > 0 {
+ msg += fmt.Sprintf(" (+%d%s)", combinedXP, player.SkillAbbr[player.Agility])
+ }
+ sess.WriteLine(g.colorize(sess, "broadcast", msg))
+
+ g.cancelAction(p)
+ g.teleportPlayer(sess, p, nextRoom)
+ } else {
+ g.cancelAction(p)
+ g.teleportPlayer(sess, p, nextRoom)
}
- d.Phase = nextPhase
- p.Action.WaitLeft = engine.ToTicks(phases[nextPhase].Delay)
+ g.AccountStore.SaveCharacter(p)
}
func (g *Game) obstacleFail(sess *net.Session, p *player.Player, d *behavior.ObstacleData) {
- startRoom := d.StartRoom
+ onFailRoom := d.OnFailRoom
failMin := d.FailDamageMin
failMax := d.FailDamageMax
@@ -155,7 +164,14 @@ func (g *Game) obstacleFail(sess *net.Session, p *player.Player, d *behavior.Obs
g.AccountStore.SaveCharacter(p)
g.cancelAction(p)
- g.teleportPlayer(sess, p, startRoom)
+ g.teleportPlayer(sess, p, onFailRoom)
+}
+
+func pluralLap(n int) string {
+ if n == 1 {
+ return ""
+ }
+ return "s"
}
// calcFailChance returns the failure probability for an obstacle attempt.