last_light/game/rpg/rpg_items.go

289 lines
6.9 KiB
Go
Raw Normal View History

2024-05-21 23:08:51 +03:00
package rpg
import (
"mvvasilev/last_light/game/item"
"github.com/gdamore/tcell/v2"
)
2024-05-30 23:39:54 +03:00
type RPGItemMetaType int
const (
MetaItemType_Physical_Weapon RPGItemMetaType = iota
MetaItemType_Magic_Weapon
MetaItemType_Weapon
MetaItemType_Physical_Armour
MetaItemType_Magic_Armour
MetaItemType_Armour
)
2024-05-21 23:08:51 +03:00
type RPGItemType interface {
RollDamage() func(victim, attacker RPGEntity) (damage int, dmgType DamageType)
2024-05-30 23:39:54 +03:00
MetaTypes() []RPGItemMetaType
2024-05-21 23:08:51 +03:00
item.ItemType
}
type BasicRPGItemType struct {
damageRollFunc func(victim, attacker RPGEntity) (damage int, dmgType DamageType)
2024-05-30 23:39:54 +03:00
metaTypes []RPGItemMetaType
2024-05-21 23:08:51 +03:00
*item.BasicItemType
}
func (it *BasicRPGItemType) RollDamage() func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return it.damageRollFunc
}
2024-05-30 23:39:54 +03:00
func (it *BasicRPGItemType) MetaTypes() []RPGItemMetaType {
return it.metaTypes
}
2024-05-21 23:08:51 +03:00
func ItemTypeBow() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
// TODO: Ranged
return RollD8(1), DamageType_Physical_Piercing
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1000,
2024-05-21 23:08:51 +03:00
"Bow",
"To shoot arrows with",
')',
" |)",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorBrown),
),
}
}
func ItemTypeLongsword() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD8(1), DamageType_Physical_Slashing
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1001,
2024-05-21 23:08:51 +03:00
"Longsword",
"You know nothing.",
'/',
"╪══",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSilver),
),
}
}
func ItemTypeClub() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD8(1), DamageType_Physical_Bludgeoning
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1002,
2024-05-21 23:08:51 +03:00
"Club",
"Bonk",
'!',
"-══",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSaddleBrown),
),
}
}
func ItemTypeDagger() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD6(1), DamageType_Physical_Piercing
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1003,
2024-05-21 23:08:51 +03:00
"Dagger",
"Stabby, stabby",
'-',
" +─",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSilver),
),
}
}
func ItemTypeHandaxe() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD6(1), DamageType_Physical_Slashing
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1004,
2024-05-21 23:08:51 +03:00
"Handaxe",
"Choppy, choppy",
'¶',
" ─╗",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSilver),
),
}
}
func ItemTypeJavelin() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
// TODO: Ranged
return RollD6(1), DamageType_Physical_Piercing
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1005,
2024-05-21 23:08:51 +03:00
"Javelin",
"Ranged pokey, pokey",
'Î',
" ─>",
20,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSilver),
),
}
}
func ItemTypeLightHammer() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD6(1), DamageType_Physical_Bludgeoning
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1006,
2024-05-21 23:08:51 +03:00
"Handaxe",
"Choppy, choppy",
'¶',
" ─╗",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSilver),
),
}
}
func ItemTypeMace() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD6(1), DamageType_Physical_Bludgeoning
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1007,
2024-05-21 23:08:51 +03:00
"Mace",
"Smashey, smashey",
'i',
" ─¤",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSilver),
),
}
}
func ItemTypeQuarterstaff() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD6(1), DamageType_Physical_Bludgeoning
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1008,
2024-05-21 23:08:51 +03:00
"Quarterstaff",
"Whacky, whacky",
'|',
"───",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSaddleBrown),
),
}
}
func ItemTypeSickle() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD6(1), DamageType_Physical_Slashing
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1009,
2024-05-21 23:08:51 +03:00
"Sickle",
"Slicey, slicey?",
'?',
" ─U",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSilver),
),
}
}
func ItemTypeSpear() RPGItemType {
return &BasicRPGItemType{
damageRollFunc: func(victim, attacker RPGEntity) (damage int, dmgType DamageType) {
return RollD8(1), DamageType_Physical_Piercing
},
2024-05-30 23:39:54 +03:00
metaTypes: []RPGItemMetaType{MetaItemType_Physical_Weapon, MetaItemType_Weapon},
2024-05-21 23:08:51 +03:00
BasicItemType: item.CreateBasicItemType(
2024-05-30 23:39:54 +03:00
1010,
2024-05-21 23:08:51 +03:00
"Spear",
"Pokey, pokey",
'Î',
"──>",
1,
item.EquippedSlotDominantHand,
tcell.StyleDefault.Foreground(tcell.ColorSilver),
),
}
}
2024-06-01 11:20:51 +03:00
type RPGItem interface {
Modifiers() []StatModifier
RPGType() RPGItemType
item.Item
}
2024-05-21 23:08:51 +03:00
type BasicRPGItem struct {
modifiers []StatModifier
2024-06-01 11:20:51 +03:00
rpgType RPGItemType
2024-05-21 23:08:51 +03:00
item.BasicItem
}
func (i *BasicRPGItem) Modifiers() []StatModifier {
return i.modifiers
}
2024-06-01 11:20:51 +03:00
func (i *BasicRPGItem) RPGType() RPGItemType {
return i.rpgType
}
2024-05-21 23:08:51 +03:00
func CreateRPGItem(name string, style tcell.Style, itemType RPGItemType, modifiers []StatModifier) RPGItem {
return &BasicRPGItem{
modifiers: modifiers,
2024-06-01 11:20:51 +03:00
rpgType: itemType,
2024-05-21 23:08:51 +03:00
BasicItem: item.CreateBasicItemWithName(
name,
style,
itemType,
1,
),
}
}