Add initiative penalties to items
This commit is contained in:
parent
09de57f67f
commit
220b00c64c
217
raws/spawns.json
217
raws/spawns.json
@ -219,7 +219,10 @@
|
|||||||
"effects": {
|
"effects": {
|
||||||
"provides_healing": "8"
|
"provides_healing": "8"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 0.5,
|
||||||
|
"base_value": 50.0,
|
||||||
|
"vendor_category": "alchemy"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Magic Missile Scroll",
|
"name": "Magic Missile Scroll",
|
||||||
@ -234,7 +237,10 @@
|
|||||||
"ranged": "6",
|
"ranged": "6",
|
||||||
"damage": "20"
|
"damage": "20"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 0.5,
|
||||||
|
"base_value": 50.0,
|
||||||
|
"vendor_category": "alchemy"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Fireball Scroll",
|
"name": "Fireball Scroll",
|
||||||
@ -250,7 +256,10 @@
|
|||||||
"damage": "20",
|
"damage": "20",
|
||||||
"area_of_effect": "3"
|
"area_of_effect": "3"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 0.5,
|
||||||
|
"base_value": 100.0,
|
||||||
|
"vendor_category": "alchemy"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Confusion Scroll",
|
"name": "Confusion Scroll",
|
||||||
@ -263,10 +272,12 @@
|
|||||||
"consumable": {
|
"consumable": {
|
||||||
"effects": {
|
"effects": {
|
||||||
"ranged": "6",
|
"ranged": "6",
|
||||||
"damage": "20",
|
|
||||||
"confusion": "4"
|
"confusion": "4"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 0.5,
|
||||||
|
"base_value": 75.0,
|
||||||
|
"vendor_category": "alchemy"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Magic Mapping Scroll",
|
"name": "Magic Mapping Scroll",
|
||||||
@ -280,7 +291,10 @@
|
|||||||
"effects": {
|
"effects": {
|
||||||
"magic_mapping": ""
|
"magic_mapping": ""
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 0.5,
|
||||||
|
"base_value": 50.0,
|
||||||
|
"vendor_category": "alchemy"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Rations",
|
"name": "Rations",
|
||||||
@ -294,7 +308,10 @@
|
|||||||
"effects": {
|
"effects": {
|
||||||
"food": ""
|
"food": ""
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 2.0,
|
||||||
|
"base_value": 0.5,
|
||||||
|
"vendor_category": "food"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Meat",
|
"name": "Meat",
|
||||||
@ -308,7 +325,10 @@
|
|||||||
"effects": {
|
"effects": {
|
||||||
"food": ""
|
"food": ""
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 2.0,
|
||||||
|
"base_value": 0.5,
|
||||||
|
"vendor_category": "food"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Hide",
|
"name": "Hide",
|
||||||
@ -317,7 +337,9 @@
|
|||||||
"fg": "#A52A2A",
|
"fg": "#A52A2A",
|
||||||
"bg": "#000000",
|
"bg": "#000000",
|
||||||
"order": 2
|
"order": 2
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 2.0,
|
||||||
|
"base_value": 5.0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Dried Sausage",
|
"name": "Dried Sausage",
|
||||||
@ -331,7 +353,9 @@
|
|||||||
"effects": {
|
"effects": {
|
||||||
"food": ""
|
"food": ""
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 2.0,
|
||||||
|
"base_value": 0.5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Beer",
|
"name": "Beer",
|
||||||
@ -345,7 +369,10 @@
|
|||||||
"effects": {
|
"effects": {
|
||||||
"provides_healing": "4"
|
"provides_healing": "4"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 2.0,
|
||||||
|
"base_value": 0.5,
|
||||||
|
"vendor_category": "food"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Rusty Longsword",
|
"name": "Rusty Longsword",
|
||||||
@ -360,7 +387,11 @@
|
|||||||
"attribute": "Might",
|
"attribute": "Might",
|
||||||
"base_damage": "1d8-1",
|
"base_damage": "1d8-1",
|
||||||
"hit_bonus": -1
|
"hit_bonus": -1
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 3.0,
|
||||||
|
"base_value": 10.0,
|
||||||
|
"initiative_penalty": 2,
|
||||||
|
"vendor_category": "junk"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Dagger",
|
"name": "Dagger",
|
||||||
@ -375,7 +406,11 @@
|
|||||||
"attribute": "Quickness",
|
"attribute": "Quickness",
|
||||||
"base_damage": "1d4",
|
"base_damage": "1d4",
|
||||||
"hit_bonus": 0
|
"hit_bonus": 0
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 1.0,
|
||||||
|
"base_value": 2.0,
|
||||||
|
"initiative_penalty": 0,
|
||||||
|
"vendor_category": "weapon"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Shortsword",
|
"name": "Shortsword",
|
||||||
@ -390,7 +425,11 @@
|
|||||||
"attribute": "Might",
|
"attribute": "Might",
|
||||||
"base_damage": "1d6",
|
"base_damage": "1d6",
|
||||||
"hit_bonus": 0
|
"hit_bonus": 0
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 2.0,
|
||||||
|
"base_value": 10.0,
|
||||||
|
"initiative_penalty": 1,
|
||||||
|
"vendor_category": "weapon"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Longsword",
|
"name": "Longsword",
|
||||||
@ -405,7 +444,11 @@
|
|||||||
"attribute": "Might",
|
"attribute": "Might",
|
||||||
"base_damage": "1d8",
|
"base_damage": "1d8",
|
||||||
"hit_bonus": 0
|
"hit_bonus": 0
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 3.0,
|
||||||
|
"base_value": 15.0,
|
||||||
|
"initiative_penalty": 2,
|
||||||
|
"vendor_category": "weapon"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Battleaxe",
|
"name": "Battleaxe",
|
||||||
@ -418,9 +461,13 @@
|
|||||||
"weapon": {
|
"weapon": {
|
||||||
"range": "melee",
|
"range": "melee",
|
||||||
"attribute": "Might",
|
"attribute": "Might",
|
||||||
"base_damage": "1d8+1",
|
"base_damage": "1d8",
|
||||||
"hit_bonus": 0
|
"hit_bonus": 0
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 4.0,
|
||||||
|
"base_value": 10.0,
|
||||||
|
"initiative_penalty": 2,
|
||||||
|
"vendor_category": "weapon"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Shield",
|
"name": "Shield",
|
||||||
@ -433,7 +480,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Shield",
|
"slot": "Shield",
|
||||||
"armor_class": 1.0
|
"armor_class": 1.0
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 5.0,
|
||||||
|
"base_value": 3.0,
|
||||||
|
"initiative_penalty": 0.5,
|
||||||
|
"vendor_category": "armor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Tower Shield",
|
"name": "Tower Shield",
|
||||||
@ -446,7 +497,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Shield",
|
"slot": "Shield",
|
||||||
"armor_class": 2.0
|
"armor_class": 2.0
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 45.0,
|
||||||
|
"base_value": 30.0,
|
||||||
|
"initiative_penalty": 1.0,
|
||||||
|
"vendor_category": "armor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Stained Tunic",
|
"name": "Stained Tunic",
|
||||||
@ -459,7 +514,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Torso",
|
"slot": "Torso",
|
||||||
"armor_class": 0.1
|
"armor_class": 0.1
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 1.0,
|
||||||
|
"base_value": 1.0,
|
||||||
|
"initiative_penalty": 0.1,
|
||||||
|
"vendor_category": "junk"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Torn Trousers",
|
"name": "Torn Trousers",
|
||||||
@ -472,7 +531,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Legs",
|
"slot": "Legs",
|
||||||
"armor_class": 0.1
|
"armor_class": 0.1
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 1.0,
|
||||||
|
"base_value": 1.0,
|
||||||
|
"initiative_penalty": 0.1,
|
||||||
|
"vendor_category": "junk"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Old Boots",
|
"name": "Old Boots",
|
||||||
@ -485,7 +548,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Feet",
|
"slot": "Feet",
|
||||||
"armor_class": 0.1
|
"armor_class": 0.1
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 1.0,
|
||||||
|
"base_value": 1.0,
|
||||||
|
"initiative_penalty": 0.1,
|
||||||
|
"vendor_category": "junk"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Cudgel",
|
"name": "Cudgel",
|
||||||
@ -500,7 +567,11 @@
|
|||||||
"attribute": "Quickness",
|
"attribute": "Quickness",
|
||||||
"base_damage": "1d4",
|
"base_damage": "1d4",
|
||||||
"hit_bonus": 0
|
"hit_bonus": 0
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 2.0,
|
||||||
|
"base_value": 0.1,
|
||||||
|
"initiative_penalty": 2.0,
|
||||||
|
"vendor_category": "junk"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Cloth Tunic",
|
"name": "Cloth Tunic",
|
||||||
@ -513,7 +584,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Torso",
|
"slot": "Torso",
|
||||||
"armor_class": 0.1
|
"armor_class": 0.1
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 1.0,
|
||||||
|
"base_value": 1.0,
|
||||||
|
"initiative_penalty": 0.1,
|
||||||
|
"vendor_category": "clothes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Cloth Pants",
|
"name": "Cloth Pants",
|
||||||
@ -526,7 +601,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Legs",
|
"slot": "Legs",
|
||||||
"armor_class": 0.1
|
"armor_class": 0.1
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 1.0,
|
||||||
|
"base_value": 1.0,
|
||||||
|
"initiative_penalty": 0.1,
|
||||||
|
"vendor_category": "clothes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Slippers",
|
"name": "Slippers",
|
||||||
@ -539,7 +618,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Feet",
|
"slot": "Feet",
|
||||||
"armor_class": 0.1
|
"armor_class": 0.1
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 1.0,
|
||||||
|
"base_value": 1.0,
|
||||||
|
"initiative_penalty": 0.1,
|
||||||
|
"vendor_category": "clothes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Leather Armor",
|
"name": "Leather Armor",
|
||||||
@ -552,7 +635,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Torso",
|
"slot": "Torso",
|
||||||
"armor_class": 1.0
|
"armor_class": 1.0
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 15.0,
|
||||||
|
"base_value": 10.0,
|
||||||
|
"initiative_penalty": 0.5,
|
||||||
|
"vendor_category": "clothes"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Leather Boots",
|
"name": "Leather Boots",
|
||||||
@ -565,7 +652,11 @@
|
|||||||
"wearable": {
|
"wearable": {
|
||||||
"slot": "Feet",
|
"slot": "Feet",
|
||||||
"armor_class": 0.2
|
"armor_class": 0.2
|
||||||
}
|
},
|
||||||
|
"weight_lbs": 2.0,
|
||||||
|
"base_value": 5.0,
|
||||||
|
"initiative_penalty": 0.25,
|
||||||
|
"vendor_category": "clothes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"mobs": [
|
"mobs": [
|
||||||
@ -592,7 +683,11 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "2d6",
|
||||||
|
"vendor": [
|
||||||
|
"food"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Shady Salesman",
|
"name": "Shady Salesman",
|
||||||
@ -612,7 +707,11 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "2d6",
|
||||||
|
"vendor": [
|
||||||
|
"junk"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Patron",
|
"name": "Patron",
|
||||||
@ -637,7 +736,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "1d4"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Priest",
|
"name": "Priest",
|
||||||
@ -657,7 +757,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "2d6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Parishioner",
|
"name": "Parishioner",
|
||||||
@ -682,7 +783,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "1d4"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Blacksmith",
|
"name": "Blacksmith",
|
||||||
@ -702,7 +804,12 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "2d6",
|
||||||
|
"vendor": [
|
||||||
|
"armor",
|
||||||
|
"weapon"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Clothier",
|
"name": "Clothier",
|
||||||
@ -722,7 +829,11 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "2d6",
|
||||||
|
"vendor": [
|
||||||
|
"clothes"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Alchemist",
|
"name": "Alchemist",
|
||||||
@ -742,7 +853,11 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "2d6",
|
||||||
|
"vendor": [
|
||||||
|
"alchemy"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Mom",
|
"name": "Mom",
|
||||||
@ -768,7 +883,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "2d6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Peasant",
|
"name": "Peasant",
|
||||||
@ -791,7 +907,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "1d2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Dock Worker",
|
"name": "Dock Worker",
|
||||||
@ -816,7 +933,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "1d2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Fisher",
|
"name": "Fisher",
|
||||||
@ -841,7 +959,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "1d2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Wannabe Pirate",
|
"name": "Wannabe Pirate",
|
||||||
@ -866,7 +985,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "2d6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Drunk",
|
"name": "Drunk",
|
||||||
@ -891,7 +1011,8 @@
|
|||||||
"Cloth Pants",
|
"Cloth Pants",
|
||||||
"Slippers"
|
"Slippers"
|
||||||
],
|
],
|
||||||
"faction": "Townsfolk"
|
"faction": "Townsfolk",
|
||||||
|
"gold": "1d2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Rat",
|
"name": "Rat",
|
||||||
@ -1046,7 +1167,8 @@
|
|||||||
"range": 6,
|
"range": 6,
|
||||||
"color": "#FFFF55"
|
"color": "#FFFF55"
|
||||||
},
|
},
|
||||||
"faction": "Bandits"
|
"faction": "Bandits",
|
||||||
|
"gold": "1d6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Orc",
|
"name": "Orc",
|
||||||
@ -1060,7 +1182,8 @@
|
|||||||
"vision_range": 8,
|
"vision_range": 8,
|
||||||
"movement": "static",
|
"movement": "static",
|
||||||
"attributes": {},
|
"attributes": {},
|
||||||
"faction": "Cave Goblins"
|
"faction": "Cave Goblins",
|
||||||
|
"gold": "1d8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Goblin",
|
"name": "Goblin",
|
||||||
@ -1074,7 +1197,8 @@
|
|||||||
"vision_range": 8,
|
"vision_range": 8,
|
||||||
"movement": "static",
|
"movement": "static",
|
||||||
"attributes": {},
|
"attributes": {},
|
||||||
"faction": "Cave Goblins"
|
"faction": "Cave Goblins",
|
||||||
|
"gold": "1d6"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Kobold",
|
"name": "Kobold",
|
||||||
@ -1088,7 +1212,8 @@
|
|||||||
"vision_range": 4,
|
"vision_range": 4,
|
||||||
"movement": "static",
|
"movement": "static",
|
||||||
"attributes": {},
|
"attributes": {},
|
||||||
"faction": "Cave Goblins"
|
"faction": "Cave Goblins",
|
||||||
|
"gold": "1d4"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Bat",
|
"name": "Bat",
|
||||||
|
@ -2,6 +2,7 @@ mod adjacent_ai_system;
|
|||||||
mod approach_ai_system;
|
mod approach_ai_system;
|
||||||
mod chase_ai_system;
|
mod chase_ai_system;
|
||||||
mod default_move_system;
|
mod default_move_system;
|
||||||
|
mod encumbrance_system;
|
||||||
mod flee_ai_system;
|
mod flee_ai_system;
|
||||||
mod initiative_system;
|
mod initiative_system;
|
||||||
mod quipping;
|
mod quipping;
|
||||||
@ -12,6 +13,7 @@ pub use adjacent_ai_system::AdjacentAI;
|
|||||||
pub use approach_ai_system::ApproachAI;
|
pub use approach_ai_system::ApproachAI;
|
||||||
pub use chase_ai_system::ChaseAI;
|
pub use chase_ai_system::ChaseAI;
|
||||||
pub use default_move_system::DefaultMoveAI;
|
pub use default_move_system::DefaultMoveAI;
|
||||||
|
pub use encumbrance_system::EncumbranceSystem;
|
||||||
pub use flee_ai_system::FleeAI;
|
pub use flee_ai_system::FleeAI;
|
||||||
pub use initiative_system::InitiativeSystem;
|
pub use initiative_system::InitiativeSystem;
|
||||||
pub use quipping::QuipSystem;
|
pub use quipping::QuipSystem;
|
||||||
|
89
src/ai/encumbrance_system.rs
Normal file
89
src/ai/encumbrance_system.rs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use ::specs::prelude::*;
|
||||||
|
|
||||||
|
use crate::components::{Attributes, EquipmentChanged, Equipped, InBackpack, Item, Pools};
|
||||||
|
use crate::game_log::GameLog;
|
||||||
|
|
||||||
|
pub struct EncumbranceSystem {}
|
||||||
|
|
||||||
|
impl<'a> System<'a> for EncumbranceSystem {
|
||||||
|
#[allow(clippy::type_complexity)]
|
||||||
|
type SystemData = (
|
||||||
|
WriteStorage<'a, EquipmentChanged>,
|
||||||
|
Entities<'a>,
|
||||||
|
ReadStorage<'a, Item>,
|
||||||
|
ReadStorage<'a, InBackpack>,
|
||||||
|
ReadStorage<'a, Equipped>,
|
||||||
|
WriteStorage<'a, Pools>,
|
||||||
|
ReadStorage<'a, Attributes>,
|
||||||
|
ReadExpect<'a, Entity>,
|
||||||
|
WriteExpect<'a, GameLog>,
|
||||||
|
);
|
||||||
|
|
||||||
|
fn run(&mut self, data: Self::SystemData) {
|
||||||
|
let (
|
||||||
|
mut equip_dirty,
|
||||||
|
entities,
|
||||||
|
items,
|
||||||
|
backpacks,
|
||||||
|
wielded,
|
||||||
|
mut pools,
|
||||||
|
attributes,
|
||||||
|
player,
|
||||||
|
mut gamelog,
|
||||||
|
) = data;
|
||||||
|
|
||||||
|
if equip_dirty.is_empty() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the map of who needs updating
|
||||||
|
let mut to_update: HashMap<Entity, (f32, f32)> = HashMap::new(); // (weight, initiative)
|
||||||
|
for (entity, _dirty) in (&entities, &equip_dirty).join() {
|
||||||
|
to_update.insert(entity, (0., 0.));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove all dirty statements
|
||||||
|
equip_dirty.clear();
|
||||||
|
|
||||||
|
// Total up equipped items
|
||||||
|
for (item, equipped) in (&items, &wielded).join() {
|
||||||
|
if to_update.contains_key(&equipped.owner) {
|
||||||
|
let totals = to_update.get_mut(&equipped.owner).unwrap();
|
||||||
|
totals.0 += item.weight_lbs;
|
||||||
|
totals.1 += item.initiative_penalty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Total up carried items
|
||||||
|
for (item, carried) in (&items, &backpacks).join() {
|
||||||
|
if to_update.contains_key(&carried.owner) {
|
||||||
|
let totals = to_update.get_mut(&carried.owner).unwrap();
|
||||||
|
totals.0 += item.weight_lbs;
|
||||||
|
totals.1 += item.initiative_penalty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the data to Pools
|
||||||
|
for (entity, (weight, initiative)) in to_update.iter() {
|
||||||
|
if let Some(pool) = pools.get_mut(*entity) {
|
||||||
|
pool.total_weight = *weight;
|
||||||
|
pool.total_initiative_penalty = *initiative;
|
||||||
|
|
||||||
|
if let Some(attr) = attributes.get(*entity) {
|
||||||
|
let carry_capacity_lbs = (attr.might.base + attr.might.modifiers) * 15;
|
||||||
|
if pool.total_weight as i32 > carry_capacity_lbs {
|
||||||
|
// Overburdened
|
||||||
|
pool.total_initiative_penalty += 4.0;
|
||||||
|
if *entity == *player {
|
||||||
|
gamelog.append(
|
||||||
|
"You are overburdened, and suffering an initiative penalty.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
mod enums;
|
mod enums;
|
||||||
mod simple;
|
mod tags;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ use ::specs::prelude::*;
|
|||||||
use ::specs::saveload::{ConvertSaveload, Marker};
|
use ::specs::saveload::{ConvertSaveload, Marker};
|
||||||
use ::specs_derive::*;
|
use ::specs_derive::*;
|
||||||
pub use enums::*;
|
pub use enums::*;
|
||||||
pub use simple::*;
|
pub use tags::*;
|
||||||
|
|
||||||
use crate::gamesystem::attr_bonus;
|
use crate::gamesystem::attr_bonus;
|
||||||
|
|
||||||
@ -81,6 +81,13 @@ pub struct WantsToMelee {
|
|||||||
pub target: Entity,
|
pub target: Entity,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct Item {
|
||||||
|
pub initiative_penalty: f32,
|
||||||
|
pub weight_lbs: f32,
|
||||||
|
pub base_value: f32,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Component, Debug, ConvertSaveload, Clone)]
|
#[derive(Component, Debug, ConvertSaveload, Clone)]
|
||||||
pub struct SufferDamage {
|
pub struct SufferDamage {
|
||||||
pub amount: Vec<(i32, bool)>,
|
pub amount: Vec<(i32, bool)>,
|
||||||
@ -250,12 +257,23 @@ pub struct Pool {
|
|||||||
pub current: i32,
|
pub current: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Pool {
|
||||||
|
pub fn new(default_value: i32) -> Pool {
|
||||||
|
Pool {
|
||||||
|
max: default_value,
|
||||||
|
current: default_value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Pools {
|
pub struct Pools {
|
||||||
pub hit_points: Pool,
|
pub hit_points: Pool,
|
||||||
pub mana: Pool,
|
pub mana: Pool,
|
||||||
pub xp: i32,
|
pub xp: i32,
|
||||||
pub level: i32,
|
pub level: i32,
|
||||||
|
pub total_weight: f32,
|
||||||
|
pub total_initiative_penalty: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Clone)]
|
#[derive(Serialize, Deserialize, Clone)]
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
///! Simple Components that are mainly used for tagging behavior. None of these have
|
||||||
|
/// any properties
|
||||||
use ::serde::{Deserialize, Serialize};
|
use ::serde::{Deserialize, Serialize};
|
||||||
use ::specs::prelude::*;
|
use ::specs::prelude::*;
|
||||||
use ::specs_derive::*;
|
use ::specs_derive::*;
|
||||||
@ -5,9 +7,6 @@ use ::specs_derive::*;
|
|||||||
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Player {}
|
pub struct Player {}
|
||||||
|
|
||||||
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
|
||||||
pub struct Item {}
|
|
||||||
|
|
||||||
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Consumable {}
|
pub struct Consumable {}
|
||||||
|
|
||||||
@ -37,3 +36,6 @@ pub struct BlocksVisibility {}
|
|||||||
|
|
||||||
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct MyTurn {}
|
pub struct MyTurn {}
|
||||||
|
|
||||||
|
#[derive(Component, Debug, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct EquipmentChanged {}
|
@ -17,11 +17,19 @@ impl<'a> System<'a> for ItemCollectionSystem {
|
|||||||
WriteStorage<'a, Position>,
|
WriteStorage<'a, Position>,
|
||||||
ReadStorage<'a, Name>,
|
ReadStorage<'a, Name>,
|
||||||
WriteStorage<'a, InBackpack>,
|
WriteStorage<'a, InBackpack>,
|
||||||
|
WriteStorage<'a, EquipmentChanged>,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn run(&mut self, data: Self::SystemData) {
|
fn run(&mut self, data: Self::SystemData) {
|
||||||
let (player_entity, mut gamelog, mut wants_pickup, mut positions, names, mut backpack) =
|
let (
|
||||||
data;
|
player_entity,
|
||||||
|
mut gamelog,
|
||||||
|
mut wants_pickup,
|
||||||
|
mut positions,
|
||||||
|
names,
|
||||||
|
mut backpack,
|
||||||
|
mut dirty,
|
||||||
|
) = data;
|
||||||
|
|
||||||
for pickup in wants_pickup.join() {
|
for pickup in wants_pickup.join() {
|
||||||
positions.remove(pickup.item);
|
positions.remove(pickup.item);
|
||||||
@ -33,6 +41,9 @@ impl<'a> System<'a> for ItemCollectionSystem {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
.expect("Failed to add item to backpack");
|
.expect("Failed to add item to backpack");
|
||||||
|
dirty
|
||||||
|
.insert(pickup.collected_by, EquipmentChanged {})
|
||||||
|
.expect("Unable to insert equipment change");
|
||||||
|
|
||||||
if pickup.collected_by == *player_entity {
|
if pickup.collected_by == *player_entity {
|
||||||
gamelog.append(format!(
|
gamelog.append(format!(
|
||||||
@ -73,6 +84,7 @@ impl<'a> System<'a> for ItemUseSystem {
|
|||||||
WriteStorage<'a, HungerClock>,
|
WriteStorage<'a, HungerClock>,
|
||||||
ReadStorage<'a, MagicMapper>,
|
ReadStorage<'a, MagicMapper>,
|
||||||
WriteExpect<'a, RunState>,
|
WriteExpect<'a, RunState>,
|
||||||
|
WriteStorage<'a, EquipmentChanged>,
|
||||||
);
|
);
|
||||||
|
|
||||||
#[allow(clippy::cognitive_complexity)]
|
#[allow(clippy::cognitive_complexity)]
|
||||||
@ -100,9 +112,13 @@ impl<'a> System<'a> for ItemUseSystem {
|
|||||||
mut hunger_clocks,
|
mut hunger_clocks,
|
||||||
magic_mapper,
|
magic_mapper,
|
||||||
mut runstate,
|
mut runstate,
|
||||||
|
mut dirty,
|
||||||
) = data;
|
) = data;
|
||||||
|
|
||||||
for (entity, useitem) in (&entities, &wants_use).join() {
|
for (entity, useitem) in (&entities, &wants_use).join() {
|
||||||
|
dirty
|
||||||
|
.insert(entity, EquipmentChanged {})
|
||||||
|
.expect("Unable to insert equipment change");
|
||||||
let mut used_item = true;
|
let mut used_item = true;
|
||||||
|
|
||||||
// Targeting
|
// Targeting
|
||||||
@ -364,6 +380,7 @@ impl<'a> System<'a> for ItemDropSystem {
|
|||||||
ReadStorage<'a, Name>,
|
ReadStorage<'a, Name>,
|
||||||
WriteStorage<'a, Position>,
|
WriteStorage<'a, Position>,
|
||||||
WriteStorage<'a, InBackpack>,
|
WriteStorage<'a, InBackpack>,
|
||||||
|
WriteStorage<'a, EquipmentChanged>,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn run(&mut self, data: Self::SystemData) {
|
fn run(&mut self, data: Self::SystemData) {
|
||||||
@ -375,6 +392,7 @@ impl<'a> System<'a> for ItemDropSystem {
|
|||||||
names,
|
names,
|
||||||
mut positions,
|
mut positions,
|
||||||
mut backpack,
|
mut backpack,
|
||||||
|
mut dirty,
|
||||||
) = data;
|
) = data;
|
||||||
|
|
||||||
for (entity, to_drop) in (&entities, &wants_drop).join() {
|
for (entity, to_drop) in (&entities, &wants_drop).join() {
|
||||||
@ -397,6 +415,10 @@ impl<'a> System<'a> for ItemDropSystem {
|
|||||||
|
|
||||||
backpack.remove(to_drop.item);
|
backpack.remove(to_drop.item);
|
||||||
|
|
||||||
|
dirty
|
||||||
|
.insert(entity, EquipmentChanged {})
|
||||||
|
.expect("Unable to insert equipment change");
|
||||||
|
|
||||||
if entity == *player_entity {
|
if entity == *player_entity {
|
||||||
gamelog.append(format!(
|
gamelog.append(format!(
|
||||||
"You drop the {}.",
|
"You drop the {}.",
|
||||||
|
@ -113,6 +113,9 @@ impl State {
|
|||||||
let mut vis = VisibilitySystem {};
|
let mut vis = VisibilitySystem {};
|
||||||
vis.run_now(&self.ecs);
|
vis.run_now(&self.ecs);
|
||||||
|
|
||||||
|
let mut encumbrance = ai::EncumbranceSystem {};
|
||||||
|
encumbrance.run_now(&self.ecs);
|
||||||
|
|
||||||
let mut initiative = ai::InitiativeSystem {};
|
let mut initiative = ai::InitiativeSystem {};
|
||||||
initiative.run_now(&self.ecs);
|
initiative.run_now(&self.ecs);
|
||||||
|
|
||||||
@ -475,6 +478,7 @@ fn main() -> ::rltk::BError {
|
|||||||
EntryTrigger,
|
EntryTrigger,
|
||||||
Equippable,
|
Equippable,
|
||||||
Equipped,
|
Equipped,
|
||||||
|
EquipmentChanged,
|
||||||
Faction,
|
Faction,
|
||||||
Hidden,
|
Hidden,
|
||||||
HungerClock,
|
HungerClock,
|
||||||
|
@ -9,6 +9,9 @@ pub struct Item {
|
|||||||
pub consumable: Option<Consumable>,
|
pub consumable: Option<Consumable>,
|
||||||
pub weapon: Option<Weapon>,
|
pub weapon: Option<Weapon>,
|
||||||
pub wearable: Option<Wearable>,
|
pub wearable: Option<Wearable>,
|
||||||
|
pub initiative_penalty: Option<f32>,
|
||||||
|
pub weight_lbs: Option<f32>,
|
||||||
|
pub base_value: Option<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
|
@ -234,7 +234,11 @@ pub fn spawn_named_item(
|
|||||||
|
|
||||||
eb = eb.with(Name::from(&item_template.name));
|
eb = eb.with(Name::from(&item_template.name));
|
||||||
|
|
||||||
eb = eb.with(Item {});
|
eb = eb.with(Item {
|
||||||
|
initiative_penalty: item_template.initiative_penalty.unwrap_or(0.),
|
||||||
|
weight_lbs: item_template.weight_lbs.unwrap_or(0.),
|
||||||
|
base_value: item_template.base_value.unwrap_or(0.),
|
||||||
|
});
|
||||||
|
|
||||||
if let Some(consumable) = &item_template.consumable {
|
if let Some(consumable) = &item_template.consumable {
|
||||||
eb = eb.with(Consumable {});
|
eb = eb.with(Consumable {});
|
||||||
@ -396,14 +400,10 @@ pub fn spawn_named_mob(
|
|||||||
let pools = Pools {
|
let pools = Pools {
|
||||||
level: mob_level,
|
level: mob_level,
|
||||||
xp: 0,
|
xp: 0,
|
||||||
hit_points: Pool {
|
hit_points: Pool::new(mob_hp),
|
||||||
current: mob_hp,
|
mana: Pool::new(mob_mana),
|
||||||
max: mob_hp,
|
total_weight: 0.,
|
||||||
},
|
total_initiative_penalty: 0.,
|
||||||
mana: Pool {
|
|
||||||
current: mob_mana,
|
|
||||||
max: mob_mana,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
eb = eb.with(pools);
|
eb = eb.with(pools);
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ pub fn save_game(ecs: &mut World) {
|
|||||||
EntryTrigger,
|
EntryTrigger,
|
||||||
Equippable,
|
Equippable,
|
||||||
Equipped,
|
Equipped,
|
||||||
|
EquipmentChanged,
|
||||||
Faction,
|
Faction,
|
||||||
Hidden,
|
Hidden,
|
||||||
HungerClock,
|
HungerClock,
|
||||||
@ -181,6 +182,7 @@ pub fn load_game(ecs: &mut World) {
|
|||||||
EntryTrigger,
|
EntryTrigger,
|
||||||
Equippable,
|
Equippable,
|
||||||
Equipped,
|
Equipped,
|
||||||
|
EquipmentChanged,
|
||||||
Faction,
|
Faction,
|
||||||
Hidden,
|
Hidden,
|
||||||
HungerClock,
|
HungerClock,
|
||||||
|
@ -39,16 +39,12 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity {
|
|||||||
})
|
})
|
||||||
.with(Skills::new(1))
|
.with(Skills::new(1))
|
||||||
.with(Pools {
|
.with(Pools {
|
||||||
hit_points: Pool {
|
hit_points: Pool::new(player_hp_at_level(11, 1)),
|
||||||
current: player_hp_at_level(11, 1),
|
mana: Pool::new(mana_at_level(11, 1)),
|
||||||
max: player_hp_at_level(11, 1),
|
|
||||||
},
|
|
||||||
mana: Pool {
|
|
||||||
current: mana_at_level(11, 1),
|
|
||||||
max: mana_at_level(11, 1),
|
|
||||||
},
|
|
||||||
xp: 0,
|
xp: 0,
|
||||||
level: 1,
|
level: 1,
|
||||||
|
total_weight: 0.,
|
||||||
|
total_initiative_penalty: 0.,
|
||||||
})
|
})
|
||||||
.with(LightSource {
|
.with(LightSource {
|
||||||
color: RGB::from_f32(1.0, 1.0, 0.5),
|
color: RGB::from_f32(1.0, 1.0, 0.5),
|
||||||
@ -56,6 +52,7 @@ pub fn player(ecs: &mut World, player_x: i32, player_y: i32) -> Entity {
|
|||||||
})
|
})
|
||||||
.with(Initiative { current: 0 })
|
.with(Initiative { current: 0 })
|
||||||
.with(Faction::from("Player"))
|
.with(Faction::from("Player"))
|
||||||
|
.with(EquipmentChanged {})
|
||||||
.marked::<SimpleMarker<SerializeMe>>()
|
.marked::<SimpleMarker<SerializeMe>>()
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user