diff options
| author | historia <[not public]> | 2026-07-07 21:22:39 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-07-07 21:22:39 -0400 |
| commit | 74803657d587b1f93b739c1ee25bb8d62df95413 (patch) | |
| tree | 0166974468c452bb13454d37d4b83d2e681446c0 /internal/game/act_agility.go | |
| parent | bae42946d24bd533cdbc1b271ce14acd752689d0 (diff) | |
| download | thehouseoficarus-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.go | 104 |
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. |
