aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/game/aggro.go54
-rw-r--r--internal/game/cmd_look.go7
-rw-r--r--internal/game/cmd_move.go1
-rw-r--r--internal/game/cmd_wear.go24
-rw-r--r--internal/game/login_char.go1
-rw-r--r--internal/object/item.go1
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"`