diff --git a/.github/workflows/map-diff.yml b/.github/workflows/map-diff.yml index 3015083b8e4..00d205d235f 100644 --- a/.github/workflows/map-diff.yml +++ b/.github/workflows/map-diff.yml @@ -51,6 +51,7 @@ jobs: pngquant --force --output diff_image.png diff_image.png identify diff_image.png + ## Write comment body log 'Uploading diff_image.png...' json=$(curl -s -F image=@diff_image.png https://api.imgur.com/3/upload | tee /dev/stderr) || continue diff --git a/.gitignore b/.gitignore index a4782861d3a..83f9933da49 100644 --- a/.gitignore +++ b/.gitignore @@ -209,6 +209,8 @@ fonts/.uuid .dirstamp *.cfg-bak *.orig +*.rej +*.png_original # might be good to have, but not in data data/**/*.xcf diff --git a/data/campaigns/Northern_Rebirth/maps/05a_01_The_Pursuit.map b/data/campaigns/Northern_Rebirth/maps/05a_01_The_Pursuit.map index 3cdd5244c31..1d39a690b47 100644 --- a/data/campaigns/Northern_Rebirth/maps/05a_01_The_Pursuit.map +++ b/data/campaigns/Northern_Rebirth/maps/05a_01_The_Pursuit.map @@ -26,11 +26,11 @@ Xu, Xu, Xu, Re^Es, Re, Xu, Xu, Xu, Xu, Xos, Xos, Urb, Rr, Urb, Xos, Xos, Xu, Xu, Xu, Xu, Xu, Xu, Uu, Xu, Xu, Xu, Xu, Xos, Xos, Urb, Rr, Urb, Xos^Efs, Xos, Xu, Xu, Xu, Urb, Cud, Urb, Xu, Xu, Xu, Xos, Urb, Rr, Urb, Xos, Xu, Wwf^Vm, Xu, Wwg, Xu, Wwf^Es, Wwf, Xu, Xu, Xu, Xu, Xu Xu, Xu, Xu, Xu, Uu, Xu, Xu, Xu, Xu, Xos, Xos, Urb, Rr, Urb, Urb, Xos, Xu, Xu, Xu, Cud, Rr, Cud, Xu, Xu, Xos, Xos^Efs, Urb, Rr, Urb, Xos, Xu, Xu, Rr, Xu, Rr, Xu, Xu, Uu, Uu, Xu, Xu, Xu Xu, Xu, Xu, Xu, Uu, Xu, Xu, Xu, Xu, Xos, Xos, Urb, Urb, Rr, Rr, Urb, Cud, Xu, Rr, Rr^Eb, Rr, Rr^Eb, Rr, Xu, Cud, Urb, Rr, Rr, Urb, Xos, Xu, Xu, Rr, Rr, Rr, Rr, Xu, Xu, Uu, Uu, Xu, Xu -Xu, Xu, Xu, Xu, Xos, Xos, Xos, Xu, Xu, Xu, Xu, Xos, Xos, Urb, Cud, Cud, Rr, Rr, Rr, Rr, Rr, Rr, Rr, Rr, Rr, Cud, Cud, Urb, Xos, Xos, Xu, Xu, Xu, Rr, Xu, Xu, Uh^Vu, Xu, Uu, Re, Uu^Es, Xu -Xu, Xu, Xu, Xu, Xos, Uu, Uu, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Rr, Rr, Rr, Rr, Rr, Ce, Rr, Rr, Rr, Rr, Rr, Xu, Xos, Xu, Xu, Xu, Xu, Xu, Xu, 3 Kud, Cud, Uh, Uh, Uu, Re, Uu, Xu -Xu, Xu, Xu, Xu, Xos, Xos^Efs, Uu, Uh, Xos, Qxu, Qxu, Xu, Xu, Xu, Xu, Rr, Rr, Rr, Rr, Ce, Ke, Ce, Rr, Rr, Rr, Rr, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Cud, Cud, Uu^Es, Uu, Uu, Xu, Xu, Xu -Xu, Xu, Xu, Xos, Uu, Uu, Uu, Uh, Xos, Qxu, Qxu, Xu, Xu, Xu, Xu, Rr, Rr, Rr, Xu, Ce, Ce, Ce, Rr, Rr, Rr, Rr, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Cud, Uu, Uu, Re, Re, Xu, Xu, Xu, Xu -Xu, Xu, Xu, Cud, Urb, Urb, Xos, Xos, Uu, Uh, Xu, Xu, Xos, Xos^Efs, Cud, Rr, Rr, Xu, Rr, Rr, Rr, Rr, Rr, Rr, Rr, Rr, Cud, Xos^Efs, Xos, Xu, Xu, Xu, Xu, Uh, Uu, Rd^Es, Uu, Uh, Xu, Xu, Xu, Xu +Xu, Xu, Xu, Xu, Xos, Xos, Xos, Xu, Xu, Xu, Xu, Xos, Xos, Urb, Cud, Cud, Rr, Rr, Rr, Rr, Rr^Vu, Rr, Rr, Rr, Rr, Cud, Cud, Urb, Xos, Xos, Xu, Xu, Xu, Rr, Xu, Xu, Uh^Vu, Xu, Uu, Re, Uu^Es, Xu +Xu, Xu, Xu, Xu, Xos, Uu, Uu, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Rr, Rr, Rr, Rr^Vu, Rr^Vu, Ce, Rr^Vu, Rr^Vu, Rr, Rr, Rr, Xu, Xos, Xu, Xu, Xu, Xu, Xu, Xu, 3 Kud, Cud, Uh, Uh, Uu, Re, Uu, Xu +Xu, Xu, Xu, Xu, Xos, Xos^Efs, Uu, Uh, Xos, Qxu, Qxu, Xu, Xu, Xu, Xu, Rr, Rr, Rr, Rr^Vu, Ce, Ke, Ce, Rr^Vu, Rr, Rr, Rr, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Cud, Cud, Uu^Es, Uu, Uu, Xu, Xu, Xu +Xu, Xu, Xu, Xos, Uu, Uu, Uu, Uh, Xos, Qxu, Qxu, Xu, Xu, Xu, Xu, Rr, Rr^Vu, Rr^Vu, Xu, Ce, Ce, Ce, Rr^Vu, Rr, Rr, Rr, Xu, Xu, Xu, Xu, Xu, Xu, Xu, Cud, Uu, Uu, Re, Re, Xu, Xu, Xu, Xu +Xu, Xu, Xu, Cud, Urb, Urb, Xos, Xos, Uu, Uh, Xu, Xu, Xos, Xos^Efs, Cud, Rr, Rr, Xu, Rr^Vu, Rr^Vu, Rr^Vu, Rr^Vu, Rr, Rr, Rr, Rr, Cud, Xos^Efs, Xos, Xu, Xu, Xu, Xu, Uh, Uu, Rd^Es, Uu, Uh, Xu, Xu, Xu, Xu Xu, Xu, Xu, Urb, Urb, Urb, Urb, Urb, Urb, Uu, Xos^Efs, Xos, Urb, Urb, Rr, Cud, Cud, Rr, Rr, Rr, Rr, Rr, Rr, Rr, Cud, Cud, Rr, Urb, Urb, Xos, Xu, Xu, Xu, Uh^Vu, Uu, Rd, Uh, Uu^Vud, Xu, Xu, Xu, Xu Xu, Xu, Xos, Xu, Urb, Urb, Urb, Urb, Xuc, Xos, Urb, Urb, Rr, Rr, Urb, Urb, Xos, Xu, Xuc, Rr, Rr, Rr, Xuc, Xu, Xos, Urb, Urb, Rr, Urb, Xos, Xu, Xu, Xu, Xu, Uu, Rd, Xu, Xu, Xu, Xu, Xu, Xu Xu, Xos, Urb, Urb, Cud, Urb, Urb, Urb, Xuc, Xuc, Urb, Rr, Urb, Urb, Xos, Xos, Xu, Xu, Xuc, Cud, Cud, Cud, Xuc, Xu, Xu, Xos, Urb, Rr, Xuc, Xu, Uh, Rd^Es, Re, Uu, Uu, Re, Xu, Xu, Xu, Xu, Xu, Xu diff --git a/data/campaigns/Northern_Rebirth/scenarios/01_Breaking_the_Chains.cfg b/data/campaigns/Northern_Rebirth/scenarios/01_Breaking_the_Chains.cfg old mode 100644 new mode 100755 index e1af5cc9d60..ca3148f7dfe --- a/data/campaigns/Northern_Rebirth/scenarios/01_Breaking_the_Chains.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/01_Breaking_the_Chains.cfg @@ -21,7 +21,6 @@ [/part] [part] story= _ "The dwarves of Knalga, cannily reckoning the gains from trade, built strong fortifications around Dwarven Doors. The dwarves and humans who called it home knew that the wealth of the city might arouse envy from afar — hence they kept their weapons sharp, and regarded themselves able to fight off any bandit gang or petty warlord." - {NR_BIGMAP} {PROLOGUE_STAGE1_END} [/part] @@ -98,7 +97,7 @@ side=1 controller=human recruit=Peasant,Woodsman - {GOLD 100 75 60} + {GOLD 100 80 60} team_name=rebels user_team_name= _ "Rebels" {FLAG_VARIANT6 ragged} @@ -143,7 +142,7 @@ [criteria] side=3 [/criteria] - value=3 + value={ON_DIFFICULTY 5 4 3} [/goal] [goal] name=target @@ -171,7 +170,7 @@ canrecruit=yes [ai] - leader_value=5 # Strong desire to kill Al'Tar + leader_value={ON_DIFFICULTY 7 6 5} # Strong desire to kill Al'Tar village_value=0.75 # Weakened desire to capture villages caution=0.50 # Wants to survive the duel [goal] @@ -179,7 +178,7 @@ [criteria] side=2 [/criteria] - value=3 + value={ON_DIFFICULTY 5 4 3} [/goal] [goal] name=target diff --git a/data/campaigns/Northern_Rebirth/scenarios/02_01_Infested_Caves.cfg b/data/campaigns/Northern_Rebirth/scenarios/02_01_Infested_Caves.cfg index cdb2087fdfa..97e5cbc0b4a 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/02_01_Infested_Caves.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/02_01_Infested_Caves.cfg @@ -4,7 +4,8 @@ id=02_01_Infested_Caves name= _ "Infested Caves" map_file=02_01_Infested_Caves.map - {TURNS 55 50 45} + # It can take a long time to break through: + {TURNS 65 55 45} next_scenario=02_02_Meeting_With_Dwarves {UNDERGROUND} @@ -47,8 +48,9 @@ [side] side=1 controller=human - {GOLD 450 400 350} - recruit=Peasant,Woodsman,Thug,Poacher,Footpad + {GOLD 500 425 350} + {INCOME 6 4 2} + recruit=Peasant,Woodsman,Thug,Poacher,Footpad,Ruffian team_name=rebels user_team_name= _ "Rebels" {FLAG_VARIANT6 ragged} @@ -65,7 +67,7 @@ side=2 controller=ai recruit=Troll Whelp - {GOLD 100 150 200} + {GOLD 80 140 200} team_name=trolls user_team_name= _ "Trolls" @@ -73,13 +75,19 @@ id=Knash name= _ "Knash" canrecruit=yes +#ifdef EASY + [ai] + # Making Knash passive gives the player a better chance of reaching Camerin's hut: + passive_leader=yes + [/ai] +#endif [/side] [side] side=3 controller=ai recruit=Troll Whelp - {GOLD 100 150 200} + {GOLD 80 140 200} team_name=trolls user_team_name= _ "Trolls" @@ -87,6 +95,12 @@ id=Krog name= _ "Krog" canrecruit=yes +#ifdef EASY + [ai] + # For symmetry with Knash: + passive_leader=yes + [/ai] +#endif [/side] # Dwarven side @@ -94,8 +108,8 @@ side=4 controller=ai recruit=Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Guardsman,Dwarvish Scout - {GOLD 130 120 100} - income=9 # covering the upkeep costs + {GOLD 190 145 100} + {INCOME 11 10 9} # covering the upkeep costs, and possibly a bit more on easier difficulties team_name=rebels user_team_name= _ "Rebels" {FLAG_VARIANT knalgan} @@ -164,8 +178,8 @@ side=6 controller=ai recruit=Troll Whelp,Troll,Troll Rocklobber - {GOLD 300 400 500} - {INCOME 14 18 22} + {GOLD 250 375 500} + {INCOME 8 15 22} team_name=trolls user_team_name= _ "Trolls" @@ -192,8 +206,8 @@ side=7 controller=ai recruit=Skeleton,Skeleton Archer - {GOLD 250 350 450} - {INCOME 4 6 8} + {GOLD 210 330 450} + {INCOME 2 5 8} team_name=undead user_team_name= _ "Undead" {FLAG_VARIANT undead} @@ -210,7 +224,7 @@ recruit=Skeleton,Skeleton Archer {GOLD 250 350 450} # One more compared to side 7, for upkeep cost of the Micro AI guardian. - {INCOME 5 7 9} + {INCOME 3 6 9} team_name=undead user_team_name= _ "Undead" diff --git a/data/campaigns/Northern_Rebirth/scenarios/05a_01_The_Pursuit.cfg b/data/campaigns/Northern_Rebirth/scenarios/05a_01_The_Pursuit.cfg index 57a1286c21f..0fba3c96d17 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/05a_01_The_Pursuit.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/05a_01_The_Pursuit.cfg @@ -26,8 +26,9 @@ [side] side=1 controller=human - recruit=Peasant,Woodsman,Thug,Poacher,Footpad - {GOLD 600 400 300} + recruit=Peasant,Woodsman,Thug,Poacher,Footpad,Ruffian + {GOLD 650 475 300} + {INCOME 3 2 1} team_name=rebels user_team_name= _ "Alliance" @@ -104,7 +105,7 @@ gold=0 # {GOLD 100 150 250} - {INCOME 10 16 22} + {INCOME 6 14 22} team_name=undead user_team_name= _ "Undead" {FLAG_VARIANT undead} @@ -507,7 +508,7 @@ [gold] side=4 - amount={ON_DIFFICULTY 200 350 500} + amount={ON_DIFFICULTY 120 310 500} [/gold] [/event] @@ -1235,10 +1236,10 @@ message= _ "Bring it on!" [/message] - # Add 200, 350 or 500 gold to treasury guards. + # Add 120, 310 or 500 gold to treasury guards. [gold] side=5 - amount={ON_DIFFICULTY 200 350 500} + amount={ON_DIFFICULTY 120 310 500} [/gold] [/event] @@ -1570,7 +1571,7 @@ [gold] side=7 - amount={ON_DIFFICULTY 200 350 500} + amount={ON_DIFFICULTY 120 310 500} [/gold] [/event] @@ -1922,7 +1923,7 @@ [gold] side=6 - amount={ON_DIFFICULTY 200 350 500} + amount={ON_DIFFICULTY 120 310 500} [/gold] [/event] @@ -1973,7 +1974,7 @@ [gold] side=3 - amount={ON_DIFFICULTY 200 250 300} + amount={ON_DIFFICULTY 120 210 300} [/gold] [/event] diff --git a/data/campaigns/Northern_Rebirth/scenarios/05a_02_Dealings.cfg b/data/campaigns/Northern_Rebirth/scenarios/05a_02_Dealings.cfg index 6e352059dca..8c794eccc91 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/05a_02_Dealings.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/05a_02_Dealings.cfg @@ -124,7 +124,7 @@ # From now on level 0 units can not be recruited anymore. # However, all of their level 1 advancements are now availaible. [disallow_recruit] - type=Peasant,Woodsman + type=Peasant,Woodsman,Ruffian [/disallow_recruit] [lock_view][/lock_view] diff --git a/data/campaigns/Northern_Rebirth/scenarios/06a_Old_Friend.cfg b/data/campaigns/Northern_Rebirth/scenarios/06a_Old_Friend.cfg index 7658c739497..c933b4ef8ed 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/06a_Old_Friend.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/06a_Old_Friend.cfg @@ -37,7 +37,8 @@ [side] side=1 controller=human - recruit=Thug,Poacher,Spearman,Bowman,Footpad + # Fencers can be replaced if/when the Dwarvish Grenadier proposal gets accepted: + recruit=Thug,Poacher,Spearman,Bowman,Footpad,Fencer {GOLD 350 300 250} team_name=knalgans user_team_name= _ "Knalgans" diff --git a/data/campaigns/Northern_Rebirth/scenarios/07a_Settling_Disputes.cfg b/data/campaigns/Northern_Rebirth/scenarios/07a_Settling_Disputes.cfg index a65310b75d5..0031e118ed6 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/07a_Settling_Disputes.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/07a_Settling_Disputes.cfg @@ -125,7 +125,9 @@ side=1 controller=human recruit=Thug,Poacher,Spearman,Bowman,Footpad - gold=0 #player has large carryover here, is handled in prestart event + # player is supposed to have a large carryover here (handled in prestart event), so leave this zero on all difficulties here: + {GOLD 0 0 0} + {INCOME 4 3 2} team_name=knalgans user_team_name= _ "Knalgans" @@ -143,7 +145,7 @@ side=2 controller=ai recruit=Dwarvish Ulfserker - {GOLD 100 90 60} + {GOLD 120 90 60} team_name=knalgans user_team_name= _ "Knalgans" {FLAG_VARIANT knalgan} @@ -158,7 +160,7 @@ {TRAIT_HEALTHY} [/modifications] - hitpoints=1 + {QUANTITY hitpoints 11 6 1} # (based on number of hits a Young Ogre would take to kill him) fog=yes share_vision=all facing=se @@ -166,43 +168,47 @@ # Place some combatants at various states of hp/xp {NOTRAIT_UNIT 2 "Dwarvish Ulfserker" 28 8} [+unit] - hitpoints=12 + {QUANTITY hitpoints 18 15 12} +#ifdef EASY + experience=41 +#else experience=40 +#endif facing=se [/unit] {NOTRAIT_UNIT 2 "Dwarvish Ulfserker" 24 7} [+unit] - hitpoints=34 - experience=8 + hitpoints=34 # max + {QUANTITY experience 10 9 8} facing=ne [/unit] {NOTRAIT_UNIT 2 "Dwarvish Ulfserker" 24 4} [+unit] - hitpoints=28 - experience=18 + {QUANTITY hitpoints 32 30 28} + {QUANTITY experience 22 20 18} facing=sw [/unit] {NOTRAIT_UNIT 2 "Dwarvish Ulfserker" 23 2} [+unit] - hitpoints=30 - experience=16 + {QUANTITY hitpoints 34 32 30} + {QUANTITY experience 20 18 16} facing=s [/unit] {NOTRAIT_UNIT 2 "Dwarvish Ulfserker" 30 7} [+unit] - hitpoints=12 - experience=16 + {QUANTITY hitpoints 16 14 12} + {QUANTITY experience 20 18 16} facing=nw [/unit] {NOTRAIT_UNIT 2 "Dwarvish Ulfserker" 22 6} [+unit] - hitpoints=9 - experience=41 + {QUANTITY hitpoints 15 12 9} + experience=41 # 42 is max facing=sw [/unit] [/side] @@ -212,7 +218,7 @@ side=3 controller=ai recruit=Gryphon,Young Ogre,Ogre,Troll Whelp,Troll,Troll Rocklobber,Red Mage,Mage - {GOLD 950 1100 1600} + {GOLD 900 1100 1600} team_name=liches user_team_name= _ "Liches" {FLAG_VARIANT undead} @@ -227,29 +233,29 @@ {NOTRAIT_UNIT 3 Troll 30 9} [+unit] - hitpoints=36 - experience=14 + {QUANTITY hitpoints 32 34 36} + {QUANTITY experience 10 12 14} facing=nw [/unit] {NOTRAIT_UNIT 3 "Young Ogre" 28 6} [+unit] - hitpoints=6 - experience=31 + {QUANTITY hitpoints 4 5 6} + {QUANTITY experience 29 30 31} facing=se [/unit] {NOTRAIT_UNIT 3 "Young Ogre" 20 7} [+unit] - hitpoints=12 - experience=12 + {QUANTITY hitpoints 10 11 12} + {QUANTITY experience 10 11 12} facing=ne [/unit] {NOTRAIT_UNIT 3 "Ogre" 23 3} [+unit] - hitpoints=27 - experience=8 + {QUANTITY hitpoints 21 24 27} + {QUANTITY experience 6 7 8} facing=n [/unit] @@ -287,7 +293,7 @@ [/store_gold] [modify_side] side=1 - {GOLD 200 100 80} + {GOLD 280 180 80} [/modify_side] # Recall heroes diff --git a/data/campaigns/Northern_Rebirth/scenarios/08a_Elvish_Princess.cfg b/data/campaigns/Northern_Rebirth/scenarios/08a_Elvish_Princess.cfg index 5278e3e6163..e32ec10d0e2 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/08a_Elvish_Princess.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/08a_Elvish_Princess.cfg @@ -4,7 +4,7 @@ id=08a_Elvish_Princess name= _ "Elvish Princess" map_file=08a_Elvish_Princess.map - {TURNS 21 18 15} + {TURNS 23 19 15} next_scenario=09a_Introductions victory_when_enemies_defeated=no @@ -94,9 +94,13 @@ [side] side=1 controller=human - recruit=Thug,Poacher,Spearman,Bowman,Gryphon,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Footpad + # Tallin only asked the mages for their gryphons at the end of the previous scenario, so don't add any more of their units here: + recruit=Thug,Poacher,Spearman,Bowman,Gryphon,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Footpad,Fencer team_name=knalgans user_team_name= _ "Knalgans" + # default gold when left unspecified is 100, so keep first 2 difficulties higher than that: + {GOLD 122 111 100} + {INCOME 9 6 3} # wmllint: recognize Tallin {CHARACTER_STATS_TALLIN} @@ -107,8 +111,8 @@ side=2 controller=ai recruit=Orcish Grunt,Orcish Archer,Wolf Rider,Orcish Assassin,Troll Whelp - {GOLD 300 400 500} - {INCOME 15 20 25} + {GOLD 250 375 500} + {INCOME 10 20 25} team_name=Orcs user_team_name= _ "Orcs" {FLAG_VARIANT6 ragged} @@ -166,8 +170,10 @@ {GENERIC_UNIT 3 "Orcish Crossbowman" 17 14} {GUARDIAN} [/side] - {STARTING_VILLAGES 1 5} - {STARTING_VILLAGES_AREA 2 15 17 12} + # 1 = Tallin, so get smaller by difficulty: + {STARTING_VILLAGES 1 {ON_DIFFICULTY 7 6 5}} + # 2 = Orcs, so get bigger by difficulty: + {STARTING_VILLAGES_AREA 2 15 17 {ON_DIFFICULTY 10 11 12}} {PLACE_PRISONER_IMAGE units/elves-wood/sorceress.png 9 14} @@ -361,6 +367,26 @@ [/message] [/event] +#ifdef EASY + [event] + name=last breath + [filter] + id=Atul + [/filter] + [message] + race=human + message= _ "This orc was carrying some gold!" + [/message] + [sound] + name=gold.ogg + [/sound] + [gold] + side=1 + {QUANTITY amount 120 80 40} + [/gold] + [/event] +#endif + # Freeing Eryssa event - victory proceed to introductions [event] name=moveto diff --git a/data/campaigns/Northern_Rebirth/scenarios/09a_Introductions.cfg b/data/campaigns/Northern_Rebirth/scenarios/09a_Introductions.cfg index 6772d56a285..e0352903cfc 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/09a_Introductions.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/09a_Introductions.cfg @@ -23,7 +23,7 @@ [side] side=1 controller=human - recruit=Thug,Poacher,Spearman,Bowman,Gryphon,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Footpad + recruit=Thug,Poacher,Spearman,Bowman,Gryphon,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Footpad,Fencer team_name=knalgans user_team_name=_ "Knalgans" @@ -49,7 +49,7 @@ {GENERIC_UNIT 2 "Troll" 10 6} {GENERIC_UNIT 2 "Troll" 11 4} {GENERIC_UNIT 2 "Troll" 16 6} - {GENERIC_UNIT 2 "Troll" 18 11} + {GENERIC_UNIT 2 {ON_DIFFICULTY "Troll Whelp" "Troll" "Troll Warrior"} 18 11} {GENERIC_UNIT 2 "Troll Whelp" 3 9} {GENERIC_UNIT 2 "Troll Whelp" 6 3} @@ -63,7 +63,7 @@ {GENERIC_UNIT 2 "Troll Rocklobber" 4 3} {GENERIC_UNIT 2 "Troll Rocklobber" 9 3} {GENERIC_UNIT 2 "Troll Rocklobber" 10 5} - {GENERIC_UNIT 2 "Troll Rocklobber" 14 3} + {GENERIC_UNIT 2 {ON_DIFFICULTY "Troll Whelp" "Troll Rocklobber" "Troll Rocklobber"} 14 3} [/side] {PLACE_IMAGE scenery/signpost.png 1 1} @@ -134,6 +134,8 @@ id=Stalrag [/recall] + {RECALL_LOYAL_DWARF} + [recall] id="Ro'Arthian" [/recall] diff --git a/data/campaigns/Northern_Rebirth/scenarios/10a_Stolen_Gold.cfg b/data/campaigns/Northern_Rebirth/scenarios/10a_Stolen_Gold.cfg index 45a7ae694f7..da236eca825 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/10a_Stolen_Gold.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/10a_Stolen_Gold.cfg @@ -156,8 +156,9 @@ [side] side=1 controller=human - recruit=Thug,Poacher,Spearman,Bowman,Gryphon,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Footpad - gold=200 + recruit=Thug,Poacher,Spearman,Bowman,Gryphon,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Footpad,Fencer + {GOLD 300 250 200} + {INCOME 3 2 1} team_name=alliance user_team_name= _ "Alliance" @@ -338,6 +339,12 @@ id="Ro'Sothian" [/recall] + {RECALL_LOYAL_DWARF} + + [recall] + type=Gryphon + [/recall] + # give player extra gold if they do not have krash [if] [not] @@ -942,7 +949,7 @@ [/message] [gold] - amount=1500 + {QUANTITY amount 1700 1600 1500} side=1 [/gold] diff --git a/data/campaigns/Northern_Rebirth/scenarios/11a_The_Eastern_Flank.cfg b/data/campaigns/Northern_Rebirth/scenarios/11a_The_Eastern_Flank.cfg index 6df017981fe..9d10a8634f9 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/11a_The_Eastern_Flank.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/11a_The_Eastern_Flank.cfg @@ -32,8 +32,9 @@ [side] side=1 controller=human - recruit=Thug,Poacher,Spearman,Bowman,Gryphon,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Footpad + recruit=Thug,Poacher,Spearman,Bowman,Gryphon,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Footpad,Fencer,Heavy Infantryman {GOLD 250 200 150} + {INCOME 3 2 1} team_name=knalgans user_team_name= _ "Alliance" @@ -48,7 +49,7 @@ controller=ai recruit=Troll Whelp,Troll,Troll Rocklobber {GOLD 500 600 700} - {INCOME 25 35 45} + {INCOME 21 33 45} team_name=orcs user_team_name= _ "Orcs" @@ -72,7 +73,7 @@ controller=ai recruit=Orcish Grunt,Orcish Warrior,Orcish Archer,Orcish Crossbowman,Wolf Rider,Orcish Assassin {GOLD 400 500 600} - {INCOME 25 35 45} + {INCOME 21 33 45} team_name=orcs user_team_name= _ "Orcs" {FLAG_VARIANT6 ragged} @@ -88,7 +89,7 @@ controller=ai recruit=Orcish Grunt,Orcish Warrior,Orcish Archer,Orcish Crossbowman,Wolf Rider,Orcish Assassin {GOLD 400 500 600} - {INCOME 25 35 45} + {INCOME 21 33 45} team_name=orcs user_team_name= _ "Orcs" {FLAG_VARIANT6 ragged} @@ -104,7 +105,7 @@ controller=ai recruit=Orcish Grunt,Orcish Warrior,Orcish Archer,Orcish Crossbowman,Wolf Rider,Orcish Assassin {GOLD 400 500 600} - {INCOME 25 35 45} + {INCOME 21 33 45} team_name=orcs user_team_name= _ "Orcs" {FLAG_VARIANT6 ragged} @@ -120,7 +121,7 @@ controller=ai recruit=Orcish Grunt,Orcish Warrior,Orcish Archer,Orcish Crossbowman,Wolf Rider,Orcish Assassin {GOLD 400 500 600} - {INCOME 25 35 45} + {INCOME 21 33 45} team_name=orcs user_team_name= _ "Orcs" {FLAG_VARIANT6 ragged} @@ -149,7 +150,8 @@ {FLAG_VARIANT long} [/side] - {STARTING_VILLAGES 1 6} + # 1 = Tallin, so reduce radius with difficulty: + {STARTING_VILLAGES 1 {ON_DIFFICULTY 8 7 6}} # Here’s where we edit out Krash's side if he's dead. [event] @@ -188,10 +190,11 @@ side=2,3,4,5,6 amount={ON_DIFFICULTY -125 -100 -75} [/gold] - {CAPTURE_VILLAGES 1 30 3 5} + {CAPTURE_VILLAGES 1 30 3 {ON_DIFFICULTY 7 6 5}} [/then] [else] - {CAPTURE_VILLAGES 7 30 3 5} + # give them to Krash instead if he is in fact still alive: + {CAPTURE_VILLAGES 7 30 3 {ON_DIFFICULTY 7 6 5}} [/else] [/if] @@ -267,6 +270,8 @@ id="Ro'Sothian" [/recall] + {RECALL_LOYAL_DWARF} + [message] speaker=Tallin message= _ "Gods of Light, look at that fortress! The castle Angthurim is even grimmer than its reputation!" diff --git a/data/campaigns/Northern_Rebirth/scenarios/13a_Showdown.cfg b/data/campaigns/Northern_Rebirth/scenarios/13a_Showdown.cfg index 648ea736210..7306c57b96f 100644 --- a/data/campaigns/Northern_Rebirth/scenarios/13a_Showdown.cfg +++ b/data/campaigns/Northern_Rebirth/scenarios/13a_Showdown.cfg @@ -47,11 +47,15 @@ canrecruit=yes side=1 controller=human - recruit=Thug,Poacher,Spearman,Bowman,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Gryphon,Footpad + recruit=Thug,Poacher,Spearman,Bowman,Dwarvish Fighter,Dwarvish Thunderer,Dwarvish Ulfserker,Dwarvish Scout,Gryphon,Footpad,Fencer team_name=knalgans user_team_name=_"Alliance" - gold=100 + # The first value here ought to be enough for the player to get through their entire recall list, + # and then the middle one is an interpolation of the halfway point between that and the existing third amount: + {GOLD 900 500 100} + {INCOME 18 12 9} [/side] + # This gets all the ones nearby; keep constant: {STARTING_VILLAGES 1 5} # Main enemy [side] @@ -69,39 +73,55 @@ x=30 y=30 [/criteria] - value=400 + value={ON_DIFFICULTY 200 300 400} + [/goal] + [goal] + name=protect_unit + [criteria] + id=Rakshas + [/criteria] + protect_radius={ON_DIFFICULTY 12 11 10} + value={ON_DIFFICULTY 250 350 450} + [/goal] # + [goal] + name=target + [criteria] + side=1 # Tallin + [/criteria] + value={ON_DIFFICULTY 60 180 300} [/goal] [goal] name=target [criteria] - side=1 + side=7 # Krash, or Ro'Arthian [/criteria] - value=300 + value={ON_DIFFICULTY 50 100 150} [/goal] [goal] name=target [criteria] - side=7 + side=8 # Hamel [/criteria] - value=150 + value={ON_DIFFICULTY 40 50 60} [/goal] + [goal] # separate target for Hamel himself: + name=target + [criteria] + id=Hamel + [/criteria] + value={ON_DIFFICULTY 30 40 50} + [/goal] # [goal] name=target [criteria] - side=8 + side=9 # Eryssa, or Ro'Sothian [/criteria] - value=50 - [/goal] - [goal] - name=target - [criteria] - side=9 - [/criteria] - value=250 + value={ON_DIFFICULTY 100 175 250} [/goal] [/ai] {FLAG_VARIANT6 ragged} [/side] + # Gets all ones nearby; keep constant: {STARTING_VILLAGES 2 3} # Sidekicks [side] @@ -117,36 +137,52 @@ user_team_name=_"Orcs" [ai] [goal] - name=target + name=protect_unit [criteria] - side=1 + id="Ha'Tuil" [/criteria] - value=400 + protect_radius={ON_DIFFICULTY 9 8 7} + value={ON_DIFFICULTY 250 350 450} [/goal] [goal] name=target [criteria] - side=7 + side=1 # Tallin [/criteria] - value=300 + value={ON_DIFFICULTY 160 280 400} [/goal] [goal] name=target [criteria] - side=8 + side=7 # Krash, or Ro'Arthian [/criteria] - value=200 + value={ON_DIFFICULTY 100 200 300} [/goal] [goal] name=target [criteria] - side=9 + side=8 # Hamel [/criteria] - value=350 + value={ON_DIFFICULTY 80 160 240} + [/goal] + [goal] # separate target for Hamel himself: + name=target + [criteria] + id=Hamel + [/criteria] + value={ON_DIFFICULTY 90 180 270} + [/goal] # + [goal] + name=target + [criteria] + side=9 # Eryssa, or Ro'Sothian + [/criteria] + value={ON_DIFFICULTY 150 250 350} [/goal] [/ai] {FLAG_VARIANT6 ragged} [/side] + # Gets all ones nearby; keep constant: {STARTING_VILLAGES 3 4} [side] @@ -162,36 +198,52 @@ user_team_name=_"Orcs" [ai] [goal] - name=target + name=protect_unit [criteria] - side=1 + id="Ar'Muff" [/criteria] - value=400 + protect_radius={ON_DIFFICULTY 9 8 7} + value={ON_DIFFICULTY 250 350 450} [/goal] [goal] name=target [criteria] - side=7 + side=1 # Tallin [/criteria] - value=300 + value={ON_DIFFICULTY 160 280 400} [/goal] [goal] name=target [criteria] - side=8 + side=7 # Krash, or Ro'Arthian [/criteria] - value=200 + value={ON_DIFFICULTY 100 200 300} [/goal] [goal] name=target [criteria] - side=9 + side=8 # Hamel [/criteria] - value=350 + value={ON_DIFFICULTY 80 160 240} + [/goal] + [goal] # separate target for Hamel himself: + name=target + [criteria] + id=Hamel + [/criteria] + value={ON_DIFFICULTY 90 180 270} + [/goal] # + [goal] + name=target + [criteria] + side=9 # Eryssa, or Ro'Sothian + [/criteria] + value={ON_DIFFICULTY 150 250 350} [/goal] [/ai] {FLAG_VARIANT6 ragged} [/side] + # Gets all ones nearby; keep constant: {STARTING_VILLAGES 4 4} [side] @@ -207,36 +259,52 @@ user_team_name=_"Orcs" [ai] [goal] - name=target + name=protect_unit [criteria] - side=1 + id="Calter" [/criteria] - value=400 + protect_radius={ON_DIFFICULTY 9 8 7} + value={ON_DIFFICULTY 250 350 450} [/goal] [goal] name=target [criteria] - side=7 + side=1 # Tallin [/criteria] - value=300 + value={ON_DIFFICULTY 160 280 400} [/goal] [goal] name=target [criteria] - side=8 + side=7 # Krash, or Ro'Arthian [/criteria] - value=200 + value={ON_DIFFICULTY 100 200 300} [/goal] [goal] name=target [criteria] - side=9 + side=8 # Hamel [/criteria] - value=350 + value={ON_DIFFICULTY 80 160 240} + [/goal] + [goal] # separate target for Hamel himself: + name=target + [criteria] + id=Hamel + [/criteria] + value={ON_DIFFICULTY 90 180 270} + [/goal] # + [goal] + name=target + [criteria] + side=9 # Eryssa, or Ro'Sothian + [/criteria] + value={ON_DIFFICULTY 150 250 350} [/goal] [/ai] {FLAG_VARIANT6 ragged} [/side] + # Gets all ones nearby; keep constant: {STARTING_VILLAGES 5 4} [side] @@ -252,36 +320,52 @@ user_team_name=_"Orcs" [ai] [goal] - name=target + name=protect_unit [criteria] - side=1 + id="Halter" [/criteria] - value=400 + protect_radius={ON_DIFFICULTY 9 8 7} + value={ON_DIFFICULTY 250 350 450} [/goal] [goal] name=target [criteria] - side=7 + side=1 # Tallin [/criteria] - value=300 + value={ON_DIFFICULTY 160 280 400} [/goal] [goal] name=target [criteria] - side=8 + side=7 # Krash, or Ro'Arthian [/criteria] - value=200 + value={ON_DIFFICULTY 100 200 300} [/goal] [goal] name=target [criteria] - side=9 + side=8 # Hamel [/criteria] - value=350 + value={ON_DIFFICULTY 80 160 240} + [/goal] + [goal] # separate target for Hamel himself: + name=target + [criteria] + id=Hamel + [/criteria] + value={ON_DIFFICULTY 90 180 270} + [/goal] # + [goal] + name=target + [criteria] + side=9 # Eryssa, or Ro'Sothian + [/criteria] + value={ON_DIFFICULTY 150 250 350} [/goal] [/ai] {FLAG_VARIANT6 ragged} [/side] + # Gets all ones nearby; keep constant: {STARTING_VILLAGES 6 4} # Krash may not actually still be alive at this point, but setting up @@ -291,7 +375,8 @@ side=7 save_id=Krash side_name= _ "Krash" - gold=200 + {GOLD 600 400 200} + {INCOME 9 6 3} recruit=Drake Fighter,Drake Glider,Drake Burner,Drake Clasher team_name=knalgans user_team_name=_"Alliance" @@ -333,12 +418,14 @@ [/object] [/modifications] [/side] + # Gets all ones nearby; keep constant: {STARTING_VILLAGES 8 10} # Side for Eryssa if alive [side] side=9 - gold=200 + {GOLD 600 400 200} + {INCOME 9 6 3} recruit=Elvish Fighter,Elvish Archer,Elvish Shaman,Elvish Scout,Elvish Captain,Elvish Hero,Elvish Ranger,Elvish Marksman,Elvish Rider,Elvish Druid,Elvish Sorceress team_name=knalgans user_team_name=_"Alliance" @@ -353,9 +440,70 @@ # STARTING_VILLAGES works due to defeat_condition & having a starting location {STARTING_VILLAGES 9 10} + # This should help prevent Hamel from suiciding himself by discouraging him + # from leaving his castle and surrounding villages + # (copied from SotBE, with modifications) + [event] + name=side 8 turn refresh + first_time_only=no + + [modify_unit] + [filter] + side=$side_number + canrecruit=yes + # Only do this if his side is AI-controlled: + [filter_side] + controller=ai + [/filter_side] + [/filter] + + [movement_costs] + flat={ON_DIFFICULTY 99 66 33} + [/movement_costs] + [/modify_unit] + + [event] + name=side turn end + + [modify_unit] + [filter] + side=$side_number + canrecruit=yes + # Only do this if his side is AI-controlled: + [filter_side] + controller=ai + [/filter_side] + [/filter] + + [movement_costs] + flat=1 + [/movement_costs] + [/modify_unit] + [/event] + [/event] + [event] name=prestart +#ifdef EASY + [terrain] + x,y=54,30 + terrain=Gg^Vh + [/terrain] + [terrain] + x,y=54,31 + terrain=Gg^Vh + [/terrain] + [capture_village] + side=1 + x,y=54,30 + [/capture_village] + [capture_village] + side=1 + x,y=54,31 + [/capture_village] +#endif + # Check if Krash is alive, if yes place him at helm of side 7, # otherwise it's taken over by older lich. {RECALL_KRASH 7} @@ -386,11 +534,16 @@ side=7 type=Troll,Troll Whelp,Ogre,Young Ogre,Mage,Red Mage,Gryphon [/allow_recruit] - # dwarves also get gold if no krash, since it's much harder to defend them + # for Ro'Arthian: [gold] - side=7,8 - amount=400 + side=7 + amount={ON_DIFFICULTY 650 525 400} [/gold] + # dwarves also get gold if no Krash (but less of it, though), since it's harder to defend them + [gold] + side=8 + amount={ON_DIFFICULTY 420 410 400} + [/gold] # [modify_side] side=7 side_name= _ "Ro’Arthian" @@ -470,10 +623,16 @@ side=9 type=Troll,Troll Whelp,Ogre,Young Ogre,Mage,Red Mage,Gryphon [/allow_recruit] + # for Ro'Sothian: [gold] - side=8,9 - amount=400 + side=9 + amount={ON_DIFFICULTY 650 525 400} [/gold] + # dwarves also get gold if no Eryssa (but less of it, though), since it's harder to defend them + [gold] + side=8 + amount={ON_DIFFICULTY 420 410 400} + [/gold] # [modify_side] side=9 side_name= _ "Ro’Sothian" @@ -957,6 +1116,7 @@ message= _ "FOR HIDEL!!" [/message] [message] + # TODO: Make sure Supporter isn't one of the characters who already said something: role=Supporter message= _ "FOR DWARVEN DOORS!!" [/message] @@ -982,7 +1142,7 @@ message= _ "Yeah. Obviously this is going to take some time. If necessary we can sit tight in our fortifications and besiege them until they starve!" [/message] [/event] - # Rakashas death + # Rakshas death [event] name=last breath [filter] diff --git a/data/campaigns/Northern_Rebirth/utils/utils.cfg b/data/campaigns/Northern_Rebirth/utils/utils.cfg index f503607204f..ac2c247ce29 100644 --- a/data/campaigns/Northern_Rebirth/utils/utils.cfg +++ b/data/campaigns/Northern_Rebirth/utils/utils.cfg @@ -45,6 +45,28 @@ [/if] #enddef +#define RECALL_LOYAL_DWARF + [recall] + race=dwarf + [filter_wml] + upkeep="loyal" + [or] + [modifications] + [trait] + id=loyal + [or] + [effect] + apply_to=overlay + add="misc/loyal-icon.png" + [/effect] + [/or] + [/trait] + [/modifications] + [/or] + [/filter_wml] + [/recall] +#enddef + #define RECALL_KRASH SIDE # In S11a-13a Krash starts as the leader of a side if he is alive. He is not # defined in the corresponding side tags for these scenarios, since if he is, diff --git a/utils/wesnoth-map-diff/images/.gitignore b/utils/wesnoth-map-diff/images/.gitignore new file mode 100644 index 00000000000..e7ce652035a --- /dev/null +++ b/utils/wesnoth-map-diff/images/.gitignore @@ -0,0 +1 @@ +!. diff --git a/utils/wesnoth-map-diff/images/Xo.png b/utils/wesnoth-map-diff/images/Xo.png new file mode 100644 index 00000000000..11e729be119 Binary files /dev/null and b/utils/wesnoth-map-diff/images/Xo.png differ diff --git a/utils/wesnoth-map-diff/src/images.ts b/utils/wesnoth-map-diff/src/images.ts index 4de63b38269..db964d46cd9 100644 --- a/utils/wesnoth-map-diff/src/images.ts +++ b/utils/wesnoth-map-diff/src/images.ts @@ -37,7 +37,21 @@ const readTerrainImages = async () => { const promises = Object .entries(dictTerrainType2ImagesPath) .map(async ([terrainType, imageName]) => { - const image = await Jimp.read(`${imageBasepath}/${imageName}.png`) + let image = await Jimp.read(`${imageBasepath}/${imageName}.png`) + // Try a number of other places, as well: + if (!image) { + image = await Jimp.read(`../../../images/${imageName}.png`) + } + if (!image) { + image = await Jimp.read(`./images/${imageName}.png`) + } + if (!image) { + image = await Jimp.read(`../../../attic/${imageName}.png`) + } + if (!image) { + // If nothing worked, provide a sensible default as a fallback: + image = await Jimp.read(`../../../data/core/images/misc/blank-hex.png`) + } return [terrainType, image] })