package game import ( "fmt" "strings" "thirdcollapse/internal/net" "thirdcollapse/internal/player" ) func (g *Game) doSay(sess *net.Session, msg string) { p := sess.Player.(*player.Player) roomID := p.RoomID for _, other := range g.Hub.PlayersInRoom(roomID) { if other == sess { other.WriteLine(fmt.Sprintf("\nYou say: %s", msg)) } else { other.WriteLine(fmt.Sprintf("\n%s says: %s", p.Name, msg)) } } } func (g *Game) doScore(sess *net.Session) { p := sess.Player.(*player.Player) sess.WriteLines( "", fmt.Sprintf("Name: %s", p.Name), fmt.Sprintf("Combat Level: %d", p.CombatLevel()), fmt.Sprintf("HP: %d/%d", p.HP, p.MaxHP()), fmt.Sprintf("Credits: %d", p.Credits), "", "Skills:", ) for _, s := range player.AllSkills { level := p.Level(s) xp := p.Skills[s] next := player.XPForNextLevel(xp) sess.WriteLine(fmt.Sprintf(" %-12s Level: %2d XP: %d / %d", s, level, xp, xp+next)) } } func (g *Game) doInventory(sess *net.Session) { p := sess.Player.(*player.Player) sess.WriteLine("") sess.WriteLine("Inventory (28 slots):") empty := 0 num := 0 for i := 0; i < 28; i++ { slot := p.InvSlot(i) if slot == nil { empty++ continue } num++ def, err := g.ItemStore.Load(slot.ItemID) name := slot.ItemID if err == nil { name = def.Name } if slot.Quantity > 1 { sess.WriteLine(fmt.Sprintf(" %2d) %d x %s", num, slot.Quantity, name)) } else { sess.WriteLine(fmt.Sprintf(" %2d) %s", num, name)) } } sess.WriteLine(fmt.Sprintf(" (%d empty slots)", empty)) } func (g *Game) doEquipment(sess *net.Session) { p := sess.Player.(*player.Player) sess.WriteLine("") sess.WriteLine("Equipment:") for _, slot := range EquipSlots { itemID, ok := p.Equipment[slot] if !ok { sess.WriteLine(fmt.Sprintf(" %-12s (empty)", slot)) continue } def, err := g.ItemStore.Load(itemID) name := itemID if err == nil { name = def.Name } sess.WriteLine(fmt.Sprintf(" %-12s %s", slot, name)) } } func (g *Game) doStyle(sess *net.Session, input string) { p := sess.Player.(*player.Player) styles := []string{"accurate", "aggressive", "defensive", "balanced"} if input == "" { sess.WriteLine("\nCombat styles:") for _, s := range styles { marker := " " if string(p.AttackStyle) == s { marker = "*" } sess.WriteLine(fmt.Sprintf(" %s %s", marker, s)) } return } input = strings.ToLower(input) var matches []string for _, s := range styles { if strings.HasPrefix(s, input) { matches = append(matches, s) } } if len(matches) == 1 { p.AttackStyle = player.AttackStyle(matches[0]) g.AccountStore.SaveCharacter(p) sess.WriteLine(fmt.Sprintf("\nCombat style set to %s.", matches[0])) return } if len(matches) > 1 { sess.WriteLine(fmt.Sprintf("\nAmbiguous style: %s. Choices: %s", input, strings.Join(matches, ", "))) return } sess.WriteLine(fmt.Sprintf("\nUnknown style: %s. Choices: accurate, aggressive, defensive, balanced", input)) }