diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/game/aggro.go | 54 | ||||
| -rw-r--r-- | internal/game/cmd_look.go | 7 | ||||
| -rw-r--r-- | internal/game/cmd_move.go | 1 | ||||
| -rw-r--r-- | internal/game/cmd_wear.go | 24 | ||||
| -rw-r--r-- | internal/game/login_char.go | 1 | ||||
| -rw-r--r-- | internal/object/item.go | 1 |
6 files changed, 88 insertions, 0 deletions
diff --git a/internal/game/aggro.go b/internal/game/aggro.go new file mode 100644 index 0000000..8f4da42 --- /dev/null +++ b/internal/game/aggro.go @@ -0,0 +1,54 @@ +package game + +import ( + "fmt" + + "thehouseoficarus/internal/combat" + "thehouseoficarus/internal/engine" + "thehouseoficarus/internal/net" + "thehouseoficarus/internal/player" +) + +func (g *Game) checkAggro(sess *net.Session) { + p := sess.Player.(*player.Player) + + if combat.GetCombat(p.Name) != nil { + return + } + + playerLevel := p.CombatLevel() + mobs := g.MobStore.MobsInRoom(p.RoomID) + + for _, mob := range mobs { + if !mob.Aggressive || mob.HP <= 0 || mob.Protected { + continue + } + if combat.IsMobInCombat(mob.InstanceID) { + continue + } + mobLevel := mobCombatLevel(mob) + if playerLevel > mobLevel*2 { + continue + } + aggMob := mob + g.Ticks.Subscribe(engine.ToTicks(1), func() bool { + if combat.GetCombat(p.Name) != nil { + return false + } + if aggMob.HP <= 0 || aggMob.RoomID != p.RoomID { + return false + } + if combat.IsMobInCombat(aggMob.InstanceID) { + return false + } + attacker := aggMob.Name + if !aggMob.Unique { + attacker = "The " + aggMob.Name + } + sess.WriteLine(fmt.Sprintf("\n%s attacks you!", g.colorize(sess, "mob_name", attacker))) + g.startCombat(sess, p, aggMob) + return false + }) + break + } +} diff --git a/internal/game/cmd_look.go b/internal/game/cmd_look.go index 1c9eb9c..14bac11 100644 --- a/internal/game/cmd_look.go +++ b/internal/game/cmd_look.go @@ -770,4 +770,11 @@ func (g *Game) showItemStats(sess *net.Session, def *object.ItemDef) { if def.Speed > 0 { sess.WriteLine(fmt.Sprintf(" Speed: %.0f", def.Speed)) } + if len(def.Requirements) > 0 { + sess.WriteLine("") + sess.WriteLine(" Requirements:") + for skill, level := range def.Requirements { + sess.WriteLine(fmt.Sprintf(" %s: %d", skill, level)) + } + } } diff --git a/internal/game/cmd_move.go b/internal/game/cmd_move.go index 2a3e698..b3fe254 100644 --- a/internal/game/cmd_move.go +++ b/internal/game/cmd_move.go @@ -153,6 +153,7 @@ func (g *Game) completeMove(sess *net.Session, p *player.Player) { } g.RunEnterSteps(sess, targetID) + g.checkAggro(sess) } func (g *Game) seedRoomMobs(roomID int) { diff --git a/internal/game/cmd_wear.go b/internal/game/cmd_wear.go index ddc970b..692a3e4 100644 --- a/internal/game/cmd_wear.go +++ b/internal/game/cmd_wear.go @@ -9,6 +9,22 @@ import ( "thehouseoficarus/internal/player" ) +func (g *Game) checkRequirements(p *player.Player, def *object.ItemDef) string { + if len(def.Requirements) == 0 { + return "" + } + var unmet []string + for skill, level := range def.Requirements { + if p.Level(player.SkillName(skill)) < level { + unmet = append(unmet, fmt.Sprintf("%d %s", level, skill)) + } + } + if len(unmet) == 0 { + return "" + } + return fmt.Sprintf("You need %s to wear %s.", strings.Join(unmet, ", "), def.Name) +} + func (g *Game) doWear(sess *net.Session, input string) { p := sess.Player.(*player.Player) @@ -54,6 +70,11 @@ func (g *Game) doWear(sess *net.Session, input string) { return } + if msg := g.checkRequirements(p, def); msg != "" { + sess.WriteLine(msg) + return + } + if def.EquipSlot == object.SlotAmmo && def.Stackable { g.equipAmmo(sess, p, match.Slot, slot, def, qty) return @@ -165,6 +186,9 @@ func (g *Game) doWearAll(sess *net.Session) { if err != nil || def.EquipSlot == "" { continue } + if g.checkRequirements(p, def) != "" { + continue + } current, exists := bestPerSlot[def.EquipSlot] val := def.Value if def.EquipSlot == object.SlotAmmo && def.Stackable { diff --git a/internal/game/login_char.go b/internal/game/login_char.go index 82065d3..84f146b 100644 --- a/internal/game/login_char.go +++ b/internal/game/login_char.go @@ -98,6 +98,7 @@ func (g *Game) connectCharacter(sess *net.Session, name string) { } g.doLook(sess) + g.checkAggro(sess) sess.Write("\r\n> ") } diff --git a/internal/object/item.go b/internal/object/item.go index 14cb65c..60d9ff9 100644 --- a/internal/object/item.go +++ b/internal/object/item.go @@ -42,6 +42,7 @@ type ItemDef struct { AttackType string `yaml:"attack_type"` Stats ItemStats `yaml:"stats"` Speed float64 `yaml:"speed"` + Requirements map[string]int `yaml:"requirements,omitempty"` ToolType string `yaml:"tool_type"` ToolSpeed float64 `yaml:"tool_speed"` BurnTicks float64 `yaml:"burn_ticks"` |
