diff --git a/.classpath b/.classpath
index d42f8d855..ca9e0e4eb 100644
--- a/.classpath
+++ b/.classpath
@@ -4,4 +4,4 @@
-
+
\ No newline at end of file
diff --git a/data/descriptions/filter_descriptions.txt b/data/descriptions/filter_descriptions.txt
index 090f5c622..b978376da 100644
--- a/data/descriptions/filter_descriptions.txt
+++ b/data/descriptions/filter_descriptions.txt
@@ -334,6 +334,24 @@
#extendeddescription "and %pronoun_pos% infernal heritage gives %pronoun_obj% great power"
#end
+#new
+#name "dragonblood desc"
+#set "lineage"
+#prev "lineage desc"
+#synonym "the dragons of old"
+#synonym "fire-breathing dragons"
+#extendeddescription "and can annihilate enemies with %pronoun_pos% fiery breath"
+#end
+
+#new
+#name "serpentblood desc"
+#set "lineage"
+#prev "lineage desc"
+#synonym "an ancient reptilian race"
+#synonym "a race of venomous lizards"
+#extendeddescription "and %pronoun% retain %pronoun_pos% deadly fangs"
+#end
+
#new
#name "pooramphibian desc"
#set "lineage"
@@ -353,6 +371,16 @@
#extendeddescription "and %pronoun% can move and breathe underwater as well as in air"
#end
+#new
+#name "psychic desc"
+#set "wondrous"
+#prev "wondrous desc"
+#bridge "wondrous bridge"
+#synonym "strange psychic powers"
+#synonym "powerful mental abilities"
+#extendeddescription "and can paralyze enemies through sheer mental force"
+#end
+
#new
#name "levy desc"
#description "Levy"
@@ -835,6 +863,17 @@
#extendeddescription "and in the light of the sun few would dare strike %pronoun_obj%"
#end
+#new
+#name "halt heretic desc"
+#synonym "an aura of sacred authority"
+#synonym "an unfaltering aura of faith"
+#synonym "the power to crush false believers"
+#extendeddescription "and those who serve foreign gods may not strike %pronoun_obj%"
+#set "wondrous"
+#prev "wondrous desc"
+#bridge "wondrous bridge"
+#end
+
#new
#name "fear desc"
#synonym "terrifying"
@@ -866,6 +905,16 @@
#extendeddescription "and those that attempt to strike %pronoun_obj% will be burned by the flames"
#end
+#new
+#name "vineshield desc"
+#set "wondrous"
+#prev "wondrous desc"
+#bridge "wondrous bridge"
+#synonym "the protection of living plants"
+#synonym "a cloak of writhing ivy"
+#extendeddescription "and can entangle attackers with growing vines"
+#end
+
#new
#name "poisonarmor desc"
#synonym "venomous thorns"
@@ -876,6 +925,16 @@
#extendeddescription "and those that attempt to strike %pronoun_obj% risk poisoning %pronoun_obj%selves"
#end
+#new
+#name "bloodvengeance desc"
+#set "wondrous"
+#prev "wondrous desc"
+#bridge "wondrous bridge"
+#synonym "an unutterable curse of vengeance"
+#synonym "a pact of blood vengeance"
+#extendeddescription "and in return for ritual mutilation %pronoun% share %pronoun_pos% pain with %pronoun_pos% attackers"
+#end
+
#new
#name "airshield desc"
#set "wondrous"
@@ -988,13 +1047,32 @@
#name "chargedbody desc"
#description "has charged body"
#synonym "a protective electric field"
-#synonym "an electrically charge"
+#synonym "an electrical charge"
#set "wondrous"
#prev "wondrous desc"
#bridge "wondrous bridge"
#extendeddescription "and will unleash a blast of lightning when struck"
#end
+#new
+#name "falconer desc"
+#set "skill"
+#prev "skill desc"
+#synonym "falconry"
+#synonym "training birds of prey"
+#extendeddescription "and %pronoun% carry trained falcons"
+#end
+
+
+#new
+#name "militia desc"
+#synonym "a personal spearbearer"
+#synonym "the power to levy peasants"
+#set "retinue"
+#prev "retinue desc"
+#next "retinue end"
+#end
+
#new
#name "shikigami desc"
#description "has a shikigami familiar"
@@ -1560,7 +1638,7 @@
#set "wondrous"
#prev "wondrous desc"
#bridge "wondrous bridge"
-#extendeddescription "and %pronoun% grow stronger in stormy weather"
+#extendeddescription "and %pronoun% grow stronger in the absence of light"
#end
#new
@@ -1582,6 +1660,25 @@
#synonym "the strength of giants"
#end
+#new
+#name "extra speed desc"
+#set "wondrous"
+#prev "wondrous desc"
+#bridge "wondrous bridge"
+#synonym "lightning speed"
+#synonym "supernatural quickness"
+#end
+
+#new
+#name "larger desc"
+#set "wondrous"
+#prev "wondrous desc"
+#bridge "wondrous bridge"
+#synonym "enormous size"
+#synonym "prodigious size and strength"
+#synonym "great stature"
+#end
+
#new
#name "springpower desc"
#synonym "a connection to the spring"
diff --git a/data/filters/default_sacredfilters.txt b/data/filters/default_sacredfilters.txt
index a04334569..30f08c578 100644
--- a/data/filters/default_sacredfilters.txt
+++ b/data/filters/default_sacredfilters.txt
@@ -182,7 +182,6 @@
#chanceinc "personalcommand #stealthy -10"
#chanceinc "race vanir -20"
#chanceinc "pose mounted *0.25"
-#power 2
#filterdesc "stealthy desc"
#end
@@ -303,34 +302,36 @@
#end
#new
-#name "fireshield2"
+#name "fireshield3"
#type "fireshield"
#basechance 0.0
-#command "#fireshield 2"
+#command "#fireshield 3"
#command "#speciallook 1"
-#chanceinc "command #fireshield +2"
+#chanceinc "command #fireshield +3"
#chanceinc "magic fire 1"
+#chanceinc pose ranged *0.25
#power 1
#filterdesc "fireshield desc"
#end
#new
-#name "fireshield4"
+#name "fireshield6"
#type "fireshield"
#basechance 0.0
-#command "#fireshield +4"
+#command "#fireshield +6"
#command "#speciallook 1"
#chanceinc "command #fireshield 1"
#chanceinc "magic fire 1"
-#power 2
+#chanceinc pose ranged *0.25
+#power 3
#filterdesc "fireshield desc"
#end
#new
-#name "fireshield6"
+#name "fireshield9"
#type "fireshield"
#basechance 0.0
-#command "#fireshield +6"
+#command "#fireshield +9"
#command "#speciallook 1"
#chanceinc "command #fireshield 0.5"
#chanceinc "magic fire 0.5"
@@ -338,7 +339,8 @@
#chanceinc "prot 10 *0.25"
#chanceinc "prot 12 *0.125"
#chanceinc "prot 15 *0"
-#power 3
+#chanceinc pose ranged *0.25
+#power 4
#filterdesc "fireshield desc"
#end
@@ -401,6 +403,7 @@
#command "#hp +2"
#command "#gcost +5"
#filterdesc "professional desc"
+#power 2
#end
#new
@@ -422,18 +425,28 @@
#basechance 0.0
#chanceinc "magic air 2"
#chanceinc "command #illusion 10"
+#chanceinc pose ranged *0.5
#command "#illusion"
#command "#stealthy +0"
-#command "#gcost *1.2"
-#command "#gcost +23"
-#price_per_command #hp 1 10
+#command "#gcost *1.1"
+#command "#gcost +15"
+#price_per_command #hp 1 20
#tag "path air"
#chanceinc "personalcommand #illusion -20"
#chanceinc "race van -20"
#chanceinc "race sidhe -20"
#chanceinc "race abysian *0.5"
+#chanceinc "prot 10 *0.5"
#chanceinc "prot 15 *0.5"
+#chanceinc "prot 20 *0.5"
+#chanceinc "def below 9 *0.25"
+#chanceinc "def below 12 *0.5"
+#chanceinc "def 17 *0.5"
+#chanceinc "def 20 *0.25"
#chanceinc "pose mounted *0.5"
+#themeinc "thisarmorprot 13 *0.25"
+#themeinc "thisarmorprot 15 *0.25"
+#themeinc "thisarmorprot 17 *0.25"
#power 4
#filterdesc "illusion desc"
#end
@@ -521,7 +534,7 @@
#command "#poisonres +3"
#command "#shockres +3"
#command "#gcost +5"
-#power 2
+#power 1
#filterdesc "allres desc"
#end
@@ -536,6 +549,7 @@
#synonym "a supernatural healing factor"
#synonym "the ability to recover from injuries"
#filterdesc "recuperation desc"
+#power 2
#end
#new
@@ -571,11 +585,12 @@
#name "stormpower"
#type "stormpower"
#basechance 0.0
-#chanceinc "magic air 1"
+#chanceinc "magic air 0.5"
#chanceinc "command #shockres 0.3"
#chanceinc "command #flying 0.2"
-#chanceinc "personalcommand #flying 3"
+#chanceinc "personalcommand #flying 1.5"
#command "#stormpower +2"
+#command "#shockres +3"
#command "#gcost +5"
#tag "path air"
#filterdesc "stormpower desc"
@@ -585,11 +600,12 @@
#name "stormpower"
#type "stormpower"
#basechance 0.0
-#chanceinc "magic air 1"
-#chanceinc "command #shockres 0.3"
-#chanceinc "command #flying 0.2"
-#chanceinc "personalcommand #flying 3"
+#chanceinc "magic air 0.25"
+#chanceinc "command #shockres 0.2"
+#chanceinc "command #flying 0.1"
+#chanceinc "personalcommand #flying 1"
#command "#stormpower +4"
+#command "#shockres +5"
#command "#gcost +10"
#power 2
#tag "path air"
@@ -599,19 +615,20 @@
#new
#type "seasonpower"
#name "springpower-low"
-#basechance 0.5
+#basechance 0.3
#chanceinc "magic water 0.75"
#chanceinc "magic nature 0.75"
#chanceinc "magic water nature 3"
#command "#springpower +25"
#tag "path nature"
#filterdesc "springpower desc"
+#power 0
#end
#new
#type "seasonpower"
#name "summerpower-low"
-#basechance 0.5
+#basechance 0.3
#chanceinc "magic fire 0.75"
#chanceinc "magic nature 0.75"
#chanceinc "magic fire nature 3"
@@ -619,24 +636,26 @@
#command "#summerpower +25"
#tag "path fire"
#filterdesc "summerpower desc"
+#power 0
#end
#new
#type "seasonpower"
#name "fallpower-low"
-#basechance 0.5
+#basechance 0.3
#chanceinc "magic earth 1"
#chanceinc "magic nature 0.5"
#chanceinc "magic earth nature 3"
#command "#fallpower +25"
#tag "path earth"
#filterdesc "fallpower desc"
+#power 0
#end
#new
#type "seasonpower"
#name "winterpower-low"
-#basechance 0.0
+#basechance 0.1
#chanceinc "magic water 0.7"
#chanceinc "magic nature 0.1"
#chanceinc "magic death 0.7"
@@ -645,24 +664,26 @@
#command "#winterpower +25"
#tag "path water"
#filterdesc "winterpower desc"
+#power 0
#end
#new
#type "seasonpower"
#name "springpower-high"
-#basechance 0.1
+#basechance 0.0
#chanceinc "magic water 0.25"
#chanceinc "magic nature 0.25"
#chanceinc "magic water nature 1"
#command "#springpower +50"
#tag "path nature"
#filterdesc "springpower desc"
+#power 0
#end
#new
#type "seasonpower"
#name "summerpower-high"
-#basechance 0.1
+#basechance 0.0
#chanceinc "magic fire 0.25"
#chanceinc "magic nature 0.25"
#chanceinc "magic fire nature 1"
@@ -670,6 +691,7 @@
#command "#summerpower +50"
#tag "path fire"
#filterdesc "summerpower desc"
+#power 0
#end
#new
@@ -682,6 +704,7 @@
#command "#fallpower +50"
#tag "path earth"
#filterdesc "fallpower desc"
+#power 0
#end
#new
@@ -696,6 +719,7 @@
#command "#winterpower +50"
#tag "path water"
#filterdesc "winterpower desc"
+#power 0
#end
#new
@@ -726,6 +750,7 @@
#command "#yearturn 2"
#command "#gcost +3"
#filterdesc "turningseasonpower desc"
+#power 2
#end
#new
@@ -736,7 +761,7 @@
#primarycommand "#blind"
#command "#darkpower +2"
#command "#darkvision 100"
-#command "#gcost +3"
+#command "#gcost +1"
#tag "path death"
#filterdesc "darkpower desc"
#end
@@ -749,7 +774,7 @@
#primarycommand "#blind"
#command "#darkpower +4"
#command "#darkvision 100"
-#command "#gcost +8"
+#command "#gcost +2"
#power 2
#tag "path death"
#filterdesc "darkpower desc"
@@ -761,7 +786,7 @@
#chanceinc "personalcommand #blind 5"
#chanceinc "magic death *2"
#command "#darkpower +2"
-#command "#gcost +3"
+#command "#gcost +1"
#tag "path death"
#filterdesc "darkpower desc"
#end
@@ -772,7 +797,7 @@
#chanceinc "personalcommand #blind 3"
#chanceinc "magic death *2"
#command "#darkpower +4"
-#command "#gcost +8"
+#command "#gcost +3"
#power 2
#tag "path death"
#filterdesc "darkpower desc"
@@ -784,6 +809,7 @@
#command "#dompower +1"
#command "#rpcost +5"
#filterdesc "dompower desc"
+#power 2
#end
#new
@@ -792,9 +818,10 @@
#basechance 0.1
#chanceinc "magic astral 0.1"
#chanceinc "command #awe +1"
+#chanceinc pose ranged *0.25
#command "#awe +1"
-#command "#gcost +15"
-#command "#gcost *1.2"
+#command "#gcost +10"
+#command "#gcost *1.1"
#price_per_command #hp 1 10
#themeinc thisarmorprot 18 *0.125
#themeinc thisarmorprot 15 *0.125
@@ -803,15 +830,17 @@
#filterdesc "awe desc"
#end
-#new magefilter
+#new
#name "sun awe"
#basechance 0.1
#chanceinc magic astral OR magic fire 0.1
#chanceinc magic astral fire 0.1
#chanceinc "command #sunawe +1"
+#chanceinc pose ranged *0.25
#command "#sunawe +1"
-#command "#gcost +15"
-#command "#gcost *1.2"
+#command "#gcost +10"
+#command "#gcost *1.1"
+#primarycommand "#command awe"
#price_per_command #hp 1 10
#themeinc thisarmorprot 18 *0.125
#themeinc thisarmorprot 15 *0.125
@@ -820,12 +849,25 @@
#filterdesc "sun awe desc"
#end
+#new
+#name "halt heretic"
+#basechance 0.1
+#chanceinc magic astral 0.1
+#chanceinc pose ranged *0.25
+#command "#haltheretic +3"
+#command "#gcost +5"
+#price_per_command #hp 1 20
+#power 2
+#filterdesc "halt heretic desc"
+#end
+
#new
#name "regen10 size 1-2"
#basechance 0.2
#chanceinc "magic nature 0.8"
#chanceinc "command #regeneration 6"
#chanceinc "personalcommand size above 2 *0"
+#chanceinc pose ranged *0.25
#command "#regeneration 10"
#command "#gcost +2"
#command "#gcost *1.25"
@@ -842,6 +884,7 @@
#chanceinc "command #regeneration 6"
#chanceinc "personalcommand size below 3 *0"
#chanceinc "personalcommand size above 4 *0"
+#chanceinc pose ranged *0.25
#command "#regeneration 10"
#command "#gcost +10"
#command "#gcost *1.25"
@@ -858,6 +901,7 @@
#chanceinc "magic nature 0.8"
#chanceinc "command #regeneration 6"
#chanceinc "personalcommand size below 5 *0"
+#chanceinc pose ranged *0.25
#command "#regeneration 10"
#command "#gcost +20"
#command "#gcost *1.5"
@@ -931,6 +975,7 @@
#type "resist"
#name "bluntres"
#basechance 0.5
+#chanceinc pose ranged *0.25
#primarycommand "#bluntres"
#command "#bluntres"
#command "#gcost +5"
@@ -942,6 +987,7 @@
#type "resist"
#name "pierceres"
#basechance 0.5
+#chanceinc pose ranged *0.5
#primarycommand "#pierceres"
#command "#pierceres"
#command "#gcost +5"
@@ -953,6 +999,7 @@
#type "resist"
#name "slashres"
#basechance 0.5
+#chanceinc pose ranged *0.25
#primarycommand "#slashres"
#command "#slashres"
#command "#gcost +5"
@@ -964,6 +1011,7 @@
#type "invuln"
#name "invulnerable (5)"
#basechance 0.5
+#chanceinc pose ranged *0.5
#primarycommand "#prot"
#command "#invulnerable +5"
#command "#gcost +8"
@@ -975,6 +1023,7 @@
#type "invuln"
#name "invulnerable (10)"
#basechance 0.25
+#chanceinc pose ranged *0.5
#primarycommand "#prot"
#command "#invulnerable +10"
#command "#gcost +10"
@@ -1009,6 +1058,7 @@
#name "poisonarmor"
#basechance 0.0
#chanceinc "magic nature 3"
+#chanceinc pose ranged *0.25
#command "#poisonarmor +5"
#command "#gcost +5"
#tag "path nature"
@@ -1020,6 +1070,7 @@
#type overcharged
#basechance 0.0
#chanceinc "magic air 2"
+#chanceinc pose ranged *0.25
#command "#overcharged +10"
#tag "path air"
#price_if_command above #prot 20 +5
@@ -1033,6 +1084,7 @@
#type overcharged
#basechance 0.0
#chanceinc "magic air 1"
+#chanceinc pose ranged *0.25
#command "#overcharged +20"
#tag "path air"
#price_if_command above #prot 15 +5
@@ -1083,7 +1135,7 @@
#chanceinc "personalcommand #amphibian -100"
#tag "nopose mounted"
#chanceinc "magic water 2"
-#power 2
+#power 1
#theme "toadtotem"
#theme "totemanimal"
#filterdesc "amphibian desc"
@@ -1100,14 +1152,14 @@
#chanceinc "magic astral 0.95"
#chanceinc "pose mounted *0.25"
#chanceinc "pose chariot *0.1"
+#chanceinc pose ranged *0.25
#themeinc thisarmorprot 18 *0.125
#themeinc thisarmorprot 15 *0.125
#themeinc thisarmorprot 12 *0.125
-#power 3
+#power 5
#filterdesc "ethereal desc"
#end
-
#new
#name "cultist"
#chance 0.1
@@ -1117,3 +1169,255 @@
#command "#startaff +20"
#filterdesc "cultist desc"
#end
+
+#new
+#name "larger"
+#basechance 0.25
+#chanceinc "magic nature 0.5"
+#chanceinc "magic earth 0.25"
+#chanceinc "personalcommand size above 5 *0"
+#chanceinc "personalcommand size below 2 *0.5"
+#chanceinc "pose ranged *0.25"
+#tag "nopose mounted"
+#tag "nopose chariot"
+#command "#size +1"
+#command "#hp *1.3"
+#command "#str +3"
+#command "#def -1"
+#command "#mapmove +2"
+#command "#drawsize 30"
+#command "#gcost +10"
+#power 3
+#filterdesc "larger desc"
+#end
+
+#new
+#name "fear"
+#basechance 0.05
+#chanceinc magic death 0.25
+#chanceinc magic blood 0.25
+#chanceinc "personalcommand size below 2 -0.4"
+#chanceinc "personalcommand size above 3 0.25"
+#chanceinc "personalcommand #undead 0.25"
+#chanceinc "personalcommand #demon 0.25"
+#chanceinc pose ranged *0.25
+#command "#fear +5"
+#command "#gcost +25"
+#command "#gcost *1.25"
+#price_per_command #hp 1 5
+#power 5
+#filterdesc "fear desc"
+#end
+
+#new
+#name "magicbeing"
+#basechance 0.1
+#chanceinc magic nature 0.25
+#chanceinc magic astral 0.25
+#chanceinc "personalcommand #illusion 0.25"
+#primarycommand "#magicbeing"
+#command "#magicbeing"
+#command "#mr +3"
+#command "#att +1"
+#command "#def +1"
+#command "#gcost +1"
+#filterdesc "magicbeing desc"
+#end
+
+#new
+#name "demonblood"
+#basechance 0.1
+#chanceinc magic blood 0.5
+#chanceinc magic fire 0.25
+#chanceinc magic astral 0.25
+#chanceinc "personalcommand #fireres 0.025"
+#chanceinc "personalcommand #undead *0"
+#primarycommand "#demon"
+#command "#demon"
+#command "#mr +1"
+#command "#gcost +4"
+#command "#str +2"
+#command "#hp +1"
+#filterdesc "demonblood desc"
+#end
+
+#new
+#name "thickskin"
+#basechance 0.5
+#chanceinc magic earth 0.5
+#chanceinc magic nature 0.5
+#chanceinc pose ranged *0.25
+#command "#prot +2"
+#filterdesc "thickskin desc"
+#end
+
+#new
+#name "golem"
+#basechance 0.25
+#chanceinc magic earth 0.25
+#chanceinc magic astral 0.25
+#chanceinc magic earth astral 0.25
+#chanceinc pose ranged *0.25
+#primarycommand "#stonebeing"
+#command "#stonebeing"
+#command "#ap -4"
+#command "#prot +4"
+#filterdesc "golem desc"
+#power 3
+#end
+
+#new
+#name "blind"
+#basechance 0.25
+#primarycommand "#blind"
+#command "#blind"
+#command "#spiritsight"
+#command "#att +1"
+#command "#def +1"
+#filterdesc "blind desc"
+#end
+
+#new
+#name "falconer"
+#basechance 0.25
+#chanceinc magic air 0.5
+#chanceinc personalcommand mountainsurvival 0.25
+#chanceinc personalcommand forestsurvival 0.25
+#chanceinc personalcommand wastesurvival 0.25
+#chanceinc personalcommand stealthy 0.25
+#chanceinc personalcommand patrolbonus 0.25
+#primarycommand "#batstartsum1"
+#command "#gcost +8"
+#command "#batstartsum1 3371"
+#filterdesc "falconer desc"
+#power 3
+#end
+
+#new
+#name "shieldbearer"
+#basechance 0.25
+#chanceinc racetag human 0.5
+#command "#gcost +8"
+#command "#batstartsum1 18"
+#primarycommand "#batstartsum1"
+#filterdesc "militia desc"
+#power 3
+#end
+
+#new
+#name "serpentblood"
+#basechance 0.1
+#chanceinc magic nature 0.25
+#chanceinc race Ophidian -10
+#chanceinc race lizard -10
+#chanceinc race naga -10
+#chanceinc race sobek -10
+#chanceinc "personalcommand #poisonres 0.25"
+#chanceinc "nationcommand #idealcold above 0 -2"
+#chanceinc "nationcommand #idealheat above 0 0.0125"
+#chanceinc "personalcommand #size above 3 -0.1"
+#chanceinc pose ranged *0.1
+#command "#coldblood"
+#command "#prot +2"
+#command "#swimming"
+#command "#weapon 239"
+#command "#poisonres 10"
+#power 3
+#filterdesc "serpentblood desc"
+#end
+
+#new
+#name "dragonblood"
+#chance 0.025
+#chanceinc magic fire 0.1
+#chanceinc race Ophidian 0.1
+#chanceinc race abysian 0.1
+#chanceinc race lizard 0.1
+#chanceinc "personalcommand #fireres 0.1"
+#chanceinc "nationcommand #idealheat above 1 0.1"
+#chanceinc pose ranged *0.1
+#price_per_command #hp 1 20
+#price_per_command #str 1 2
+#define "#weapon fixeddrakefire"
+#command "#fireres +10"
+#command "#hp +3"
+#command "#str +1"
+#command "#prot +2"
+#command "#gcost +20"
+#command "#gcost *1.2"
+#command "#rpcost +30"
+#power 5
+#filterdesc "dragonblood desc"
+#end
+
+#new
+#name "psychic"
+#chance 0.05
+#chanceinc magic astral 0.25
+#chanceinc race illithid -100
+#command "#voidsanity +10"
+#command "#mr +2"
+#command "#weapon 86"
+#nopose chariot
+#nopose ranged
+#power 4
+#filterdesc "psychic desc"
+#end
+
+#new
+#name "extra speed"
+#basechance 0.25
+#chanceinc magic air 0.5
+#chanceinc race van 0.1
+#chanceinc race sidhe 0.1
+#command "#ap +1"
+#command "#ap *1.3"
+#command "#def +1"
+#command "#mapmove +4"
+#command "#gcost +3"
+#filterdesc "extra speed desc"
+#power 2
+#end
+
+#new
+#name "flight"
+#basechance 0.25
+#chanceinc magic air 0.2
+#chanceinc magic astral 0.1
+#chanceinc magic air astral 0.2
+#chanceinc magic earth -0.1
+#primarycommand "#flying"
+#command "#flying"
+#command "#mapmove +6"
+#command "#gcost +5"
+#filterdesc "flying desc"
+#power 5
+#end
+
+#new
+#name "vineshield"
+#basechance 0.05
+#chanceinc magic nature 0.2
+#chanceinc magic nature earth 0.1
+#chanceinc magic nature astral 0.1
+#chanceinc magic earth 0.1
+#chanceinc pose ranged *0.1
+#command "#entangle"
+#command "#gcost *1.2"
+#price_per_command #hp 1 10
+#power 5
+#filterdesc "vineshield desc"
+#end
+
+#new
+#name "bloodvengeance"
+#basechance 0.05
+#chanceinc magic blood 0.25
+#chanceinc pose ranged *0.5
+#command "#bloodvengeance +1"
+#command "#startaff +65"
+#command "#gcost *1.1"
+#price_per_command #hp 1 5
+#power 5
+#filterdesc "bloodvengeance desc"
+#end
\ No newline at end of file
diff --git a/data/filters/default_sacredfilters_shapeshift.txt b/data/filters/default_sacredfilters_shapeshift.txt
index 40e4bf234..fdf076cef 100644
--- a/data/filters/default_sacredfilters_shapeshift.txt
+++ b/data/filters/default_sacredfilters_shapeshift.txt
@@ -402,4 +402,33 @@
#theme "spidertotem"
#theme "totemanimal"
#filterdesc "spider shift desc"
+#end
+
+#new
+#type "shapeshift"
+#name "ghost"
+#basechance 0.025
+#chanceinc "magic death 0.25"
+#chanceinc "magic blood 0.1"
+#chanceinc "magic nature *0.25"
+#chanceinc "personalcommand #size above 3 *0"
+#chanceinc "personalcommand undead *0"
+#command "#secondtmpshape ghost"
+#command "#gcost *1.2"
+#power 4
+#filterdesc "ghost desc"
+#end
+
+#new
+#type "shapeshift"
+#name "lesserhorror"
+#basechance 0.01
+#chanceinc "magic astral 0.01"
+#chanceinc "magic blood 0.05"
+#chanceinc "magic astral blood 0.5"
+#command "#secondtmpshape lesserhorror"
+#command "#horrormark"
+#command "#gcost *1.2"
+#power 3
+#filterdesc "lesserhorror desc"
#end
\ No newline at end of file
diff --git a/data/items/customitems.txt b/data/items/customitems.txt
index 0ac7d0d0c..be46085ad 100644
--- a/data/items/customitems.txt
+++ b/data/items/customitems.txt
@@ -2337,7 +2337,6 @@
#command "#natural"
#end
-
#new customweapon
#name "crabpincer"
#command "#dmg 1"
@@ -2347,3 +2346,9 @@
#command "#slash"
#command "#natural"
#end
+
+#new customweapon
+#name "fixeddrakefire"
+#command "#copyweapon 567"
+#command "#bowstr"
+#end
\ No newline at end of file
diff --git a/graphics/vaettir/armor/robes/loincloth.png b/graphics/vaettir/armor/robes/loincloth.png
index a87ab40c6..77988e9c9 100644
Binary files a/graphics/vaettir/armor/robes/loincloth.png and b/graphics/vaettir/armor/robes/loincloth.png differ
diff --git a/src/nationGen/chances/ChanceIncConditionType.java b/src/nationGen/chances/ChanceIncConditionType.java
index bc10e3eaa..9722d14b2 100644
--- a/src/nationGen/chances/ChanceIncConditionType.java
+++ b/src/nationGen/chances/ChanceIncConditionType.java
@@ -747,6 +747,17 @@ Condition parseConditionArguments(ArgParser args) {
}
},
+ DEF("def") {
+ @Override
+ Condition parseConditionArguments(ArgParser args) {
+ boolean not = args.nextOptionalFlag("not");
+ boolean below = args.nextOptionalFlag("below");
+ int target = args.nextInt();
+
+ return d -> d.u.getTotalDef() >= target != (below ^ not);
+ }
+ },
+
ENC("enc") {
@Override
Condition parseConditionArguments(ArgParser args) {
diff --git a/src/nationGen/nation/Nation.java b/src/nationGen/nation/Nation.java
index 64a69d044..512df3d83 100644
--- a/src/nationGen/nation/Nation.java
+++ b/src/nationGen/nation/Nation.java
@@ -276,11 +276,8 @@ else if(random.nextDouble() > 0.9)
// Sacred
for(int i = 0; i < sacredcount; i++)
{
-
int power = 1;
-
-
-
+
if(random.nextDouble() < 0.9)
{
power++;
diff --git a/src/nationGen/rostergeneration/SacredGenerator.java b/src/nationGen/rostergeneration/SacredGenerator.java
index 02169a110..1928dd8b7 100644
--- a/src/nationGen/rostergeneration/SacredGenerator.java
+++ b/src/nationGen/rostergeneration/SacredGenerator.java
@@ -44,7 +44,6 @@ public SacredGenerator(NationGen g, Nation n, NationGenAssets assets) {
private void addEpicness(Unit u, boolean sacred, int power)
{
-
int origpower = power;
// Determine stat boost amount
@@ -168,22 +167,26 @@ private void addEpicness(Unit u, boolean sacred, int power)
}
// Add more stat boosts
- else if(random.nextDouble() < 1.1 - powerups / (double)origpower)
+ else if(random.nextDouble() < 1.05 - powerups / (double)origpower)
{
-
power--;
powerups++;
}
// Add a filter
else
- {
-
-
+ {
List choices = ChanceIncHandler.getFiltersWithPower(power, power, filters);
- if(choices.size() == 0 || random.nextDouble() > 0.8)
+ if(choices.size() == 0 || random.nextDouble() > 0.5)
choices = ChanceIncHandler.getFiltersWithPower(power - 1, power, filters);
+ if(choices.size() == 0 || random.nextDouble() > 0.5)
+ choices = ChanceIncHandler.getFiltersWithPower(power / 2, power, filters);
+
+ if (choices.size() == 0 || random.nextDouble() > 0.5)
+ choices = ChanceIncHandler.getFiltersWithPower(0, power, filters);
+
+ /*
if(choices.size() == 0)
{
int range = 1;
@@ -195,12 +198,13 @@ else if(random.nextDouble() < 1.1 - powerups / (double)origpower)
}
if(choices.size() == 0 || power <= 2 || (power <= 3 && random.nextDouble() < 0.35))
choices = ChanceIncHandler.getFiltersWithPower(-100, power, filters);
+ */
if(random.nextDouble() < 0.05)
{
List maybe = ChanceIncHandler.getFiltersWithPower(-100, -1, filters);
- if(choices.size() > 0)
+ if(maybe.size() > 0)
choices = maybe;
@@ -418,16 +422,19 @@ public Unit generateUnit(boolean sacred, int power, boolean isFirstSacred)
public Unit generateUnit(boolean sacred, int power, Race race, boolean isFirstSacred)
{
+ if (sacred)
+ {
+ // Handle sacred power settings
+ double extrapower = this.nationGen.settings.get(SettingsType.sacredpower) - 1;
+
+ power = (int) (power + power * extrapower * (1 + random.nextDouble() * 0.5) + extrapower);
+ }
if(race == null)
race = getRace(sacred);
-
Pose p = getPose(sacred, power, race, isFirstSacred);
-
-
-
double epicchance = random.nextDouble() * 0.5 + power * 0.25 + 0.25;
Unit u = this.unitGen.generateUnit(race, p);
@@ -495,37 +502,40 @@ else if(!canBeSacred(sacred, nation.races.get(0)))
}
public Pose getPose(boolean sacred, int power, Race race, boolean isFirstSacred)
- {
+ {
+ /*
+ * This calculation is never actually used in this method - presumably at some point code got rearranged
+ *
// Handle sacred power settings
double extrapower = this.nationGen.settings.get(SettingsType.sacredpower) - 1;
power = (int) (power + power * extrapower * (1 + random.nextDouble() * 0.5) + extrapower);
-
-
+ */
List possibleposes = new ArrayList<>();
- // Note that the first sacred of a nation should only be ranged if no others are available
+ // Note that the first sacred of a nation should very rarely be ranged if any others are available
ChanceDistribution roles = new ChanceDistribution<>();
String toGet = "sacred";
if(race.hasSpecialRole("infantry", sacred)) {
- roles.setChance("infantry", race.tags.getDouble(toGet + "infantrychance").orElse(1.0));
+ roles.setChance("infantry", race.tags.getDouble(toGet + "infantrychance").orElse(1.0) + power * 0.1);
}
if(race.hasSpecialRole("mounted", sacred)) {
- roles.setChance("mounted", race.tags.getDouble(toGet + "mountedchance").orElse(0.25));
+ roles.setChance("mounted", race.tags.getDouble(toGet + "mountedchance").orElse(0.25) + power * 0.15);
}
if(race.hasSpecialRole("chariot", sacred)) {
- roles.setChance("chariot", race.tags.getDouble(toGet + "chariotchance").orElse(0.05));
+ roles.setChance("chariot", race.tags.getDouble(toGet + "chariotchance").orElse(0.05) + power * 0.1);
}
if(race.hasSpecialRole("ranged", sacred) && !isFirstSacred) {
- roles.setChance("ranged", race.tags.getDouble(toGet + "rangedchance").orElse(0.125));
+ roles.setChance("ranged", race.tags.getDouble(toGet + "rangedchance").orElse(0.25));
}
else if(race.hasSpecialRole("ranged", sacred)) {
- roles.setChance("ranged",0.0001);
+ roles.setChance("ranged",0.05);
}
- while(roles.hasPossible())
+ // FIXED: this loop used to iterate through all possible roles and condense them into a single array with no weighting, ignoring the checks above and resulting in unwanted numbers of ranged sacreds
+ while(roles.hasPossible() && possibleposes.isEmpty())
{
String role = roles.getRandom(this.random);
roles.eliminate(role);
@@ -547,13 +557,8 @@ else if(((race.tags.containsName("all_troops_sacred") && sacred) || ((race.tags.
possibleposes.add(p);
}
}
-
- //if(possibleposes.size() > 0)
- //break;
}
-
-
if(possibleposes.isEmpty()) {
throw new IllegalStateException("No " + (sacred ? "sacred" : "elite") + " poses were found for " + race.name + ". Consider adding #all_troops_sacred or #all_troops_elite to race file to use normal poses.");
}
@@ -567,6 +572,7 @@ else if(((race.tags.containsName("all_troops_sacred") && sacred) || ((race.tags.
/**
* Adds some cost and caponlyness if unit is badass enough
+ * Non-badass sacreds get some small buffs
* @param u
* @param power
*/
@@ -574,21 +580,19 @@ public void calculatePower(Unit u, int power)
{
// Calculate some loose power rating
- double rating = 0;
- for(Filter f : u.appliedFilters)
- rating += Math.pow(2, f.power) / 2;
+ double rating = power;
+ for(Filter f : u.appliedFilters)
+ rating += Math.pow(2, f.power - 2) / 2;
// Rating should theoretically range from 0 to 4ish at this point
-
-
+
if(u.pose.roles.contains("ranged") || u.pose.roles.contains("elite ranged") || u.pose.roles.contains("sacred ranged"))
{
- if(u.getTotalProt() < 5)
- rating *= 2;
- else if(u.getTotalProt() < 8)
- rating *= 1.75;
- else if(u.getTotalProt() < 12)
+ //this used to be a bonus for low prot, but low resources is more relevant and accurate
+ if(u.getResCost(true) < 10)
rating *= 1.5;
+ else if(u.getResCost(true) < 20)
+ rating *= 1.25;
}
else
{
@@ -600,36 +604,84 @@ else if(u.getTotalProt() < 12)
rating *= 0.8;
}
- double total = 1;
- for(Double multi : Generic.getAllUnitTags(u).getAllDoubles("sacredratingmulti"))
+ int survivability = (u.getCommandValue("#hp", 10) / 2 + u.getTotalDef() + u.getTotalProt() * 2 + u.getCommandValue("#size", 2) - power) / 2;
+ int defbonus = 0;
+ double discount = 1;
+
+ for (Filter f : u.appliedFilters)
{
- total *= multi;
+ for (Command c : f.getCommands())
+ {
+ if (c.command.equals("#regen")) survivability += 5;
+ if (c.command.equals("#awe") || c.command.equals("#sunawe")) survivability += 10;
+ if (c.command.equals("#invuln")) survivability += 10;
+ if (c.command.equals("#illusion")) survivability += 10;
+ if (c.command.equals("#ethereal")) survivability += 15;
+ if (c.command.equals("#entangle")) survivability += 15;
+ }
}
- rating *= total;
+ //sacreds that are too flimsy get extra defense and cost discount, and are more likely to be rec-anywhere
+ for (int i=15; i < 31; i +=5)
+ {
+ if (survivability < i)
+ {
+ rating--;
+
+ if (random.nextDouble() < (double)(100 - survivability - power) / 100)
+ defbonus += 1;
+ else if (random.nextDouble() < (double)(100 - survivability - power) / 100)
+ rating -= 2;
+
+ if (random.nextDouble() < (double)(100 - power * 5) / 100) discount -= 0.1;
+ }
+ }
+
+ if (defbonus > 0)
+ u.commands.add(Command.args("#def", "+" + defbonus));
- total = 1;
- for(Double multi : Generic.getAllUnitTags(u).getAllDoubles("sacredcostmulti"))
+ double total = 1;
+ for(Double multi : Generic.getAllUnitTags(u).getAllDoubles("sacredratingmulti"))
{
total *= multi;
}
- u.commands.add(Command.args("#gcost", "*" + total));
-
+ rating *= total;
// The highest caponlychance for the unit will apply if one is defined, unless the default formula is higher
double highestcaponlychance = Generic.getAllUnitTags(u).streamAllValues("caponlychance")
.map(Arg::getDouble)
.max(Double::compareTo).orElse(0D);
- if(highestcaponlychance < ((power + rating) / 10 + 0.3))
- highestcaponlychance = (power + rating) / 10 + 0.3;
+ // sacreds that are still too flimsy are much more likely to be rec-anywhere
+ if (survivability / discount + defbonus < random.nextDouble() * 25 + 5)
+ {
+ highestcaponlychance = Math.max(highestcaponlychance, 0.25);
+ if (survivability / discount + defbonus < random.nextDouble() * 25 + 5)
+ highestcaponlychance = 0;
+ }
+ else
+ if(highestcaponlychance < ((rating) / 10 + 0.3))
+ highestcaponlychance = (rating) / 10 + 0.3;
if(random.nextDouble() < highestcaponlychance)
+ {
u.caponly = true;
+
+ //apply cost discount if cap-only
+ total = discount;
+ for(Double multi : Generic.getAllUnitTags(u).getAllDoubles("sacredcostmulti"))
+ {
+ total *= multi;
+ }
+ u.commands.add(Command.args("#gcost", "*" + total));
+ }
else
{
if(u.getGoldCost() <= 50)
- u.commands.add(Command.args("#gcost", "+10"));
+ {
+ int costModifier = (int)(Math.log(u.getGoldCost()) * 10 / (Math.log(50)));
+ u.commands.add(Command.args("#gcost", "+" + costModifier));
+ }
else
u.commands.add(Command.args("#gcost", "*1.2"));
diff --git a/src/nationGen/units/Unit.java b/src/nationGen/units/Unit.java
index a715a8f43..533a75dcb 100644
--- a/src/nationGen/units/Unit.java
+++ b/src/nationGen/units/Unit.java
@@ -1477,6 +1477,39 @@ public int getTotalEnc()
return (int)prot;
}
+ public int getTotalDef()
+ {
+ int eqdef = 0;
+ int natural = 0;
+
+ for(Command c : this.getCommands())
+ {
+ if(c.command.equals("#def"))
+ {
+ natural += c.args.get(0).getInt();
+ }
+ if (c.command.equals("#mounted"))
+ eqdef += 3;
+ }
+
+ Dom3DB armordb = nationGen.armordb;
+ Dom3DB weapondb = nationGen.weapondb;
+
+ for(String slot : slotmap.getSlots())
+ {
+ if(getSlot(slot) != null && !getSlot(slot).id.equals("-1"))
+ {
+ if (getSlot(slot).armor)
+ eqdef += armordb.GetInteger(getSlot(slot).id, "def", 0);
+ else
+ eqdef += weapondb.GetInteger(getSlot(slot).id, "def", 0);
+ }
+ }
+
+ double def = eqdef + natural;
+
+ return (int)def;
+ }
public List writeLines(String spritedir)
{