mirror of
https://github.com/wesnoth/wesnoth
synced 2025-05-03 02:23:18 +00:00
351 lines
10 KiB
INI
351 lines
10 KiB
INI
#textdomain wesnoth
|
|
|
|
# Side-utils macros for balancing AI behaviour and setting village ownership.
|
|
# You can, for example give an AI side the possibility to recruit high
|
|
# level units but not to have too many of them at the same time.
|
|
|
|
# Note: These generate events, so they need to be placed directly
|
|
# under your [scenario] tag, and not within an event such as start or
|
|
# prestart.
|
|
|
|
#define LIMIT_CONTEMPORANEOUS_RECRUITS SIDE TYPE LIMIT_NUMBER
|
|
# Limit the number of units passing a specified filter that a side
|
|
# can have simultaneously. When the number of matching units
|
|
# side has reaches or exceeds LIMIT_NUMBER, that side is prevented from
|
|
# recruiting more until the number of units of that type drops
|
|
# below LIMIT_NUMBER again.
|
|
#
|
|
# Allow side 2 no more than 2 Troll Rocklobbers at a time
|
|
#! {LIMIT_CONTEMPORANEOUS_RECRUITS 2 "Troll Rocklobber" 2}
|
|
[event]
|
|
name=side turn
|
|
first_time_only=no
|
|
|
|
{VARIABLE LCR_temp {SIDE}}
|
|
|
|
[if]
|
|
[variable]
|
|
name=LCR_temp
|
|
contains=$side_number
|
|
[/variable]
|
|
|
|
[then]
|
|
[if]
|
|
[have_unit]
|
|
side=$side_number
|
|
type={TYPE}
|
|
count="{LIMIT_NUMBER}-99999"
|
|
[/have_unit]
|
|
|
|
[then]
|
|
[disallow_recruit]
|
|
side=$side_number
|
|
type={TYPE}
|
|
[/disallow_recruit]
|
|
[/then]
|
|
|
|
[else]
|
|
[allow_recruit]
|
|
side=$side_number
|
|
type={TYPE}
|
|
[/allow_recruit]
|
|
[/else]
|
|
[/if]
|
|
[/then]
|
|
[/if]
|
|
|
|
{CLEAR_VARIABLE LCR_temp}
|
|
[/event]
|
|
|
|
[event]
|
|
name=recruit
|
|
first_time_only=no
|
|
|
|
[filter]
|
|
side={SIDE}
|
|
type={TYPE}
|
|
[/filter]
|
|
|
|
[if]
|
|
[have_unit]
|
|
side=$side_number
|
|
type={TYPE}
|
|
count="{LIMIT_NUMBER}-99999"
|
|
[/have_unit]
|
|
|
|
[then]
|
|
[disallow_recruit]
|
|
side=$side_number
|
|
type={TYPE}
|
|
[/disallow_recruit]
|
|
[/then]
|
|
[/if]
|
|
[/event]
|
|
#enddef
|
|
|
|
#define LIMIT_RECRUITS SIDE TYPE LIMIT_NUMBER
|
|
# Limit the total number of units passing a specified filter that a given
|
|
# side can recruit in the scenario.
|
|
#
|
|
# Allow side 2 no more than 1 Draug in the entire scenario
|
|
#! {LIMIT_RECRUITS 2 Draug 1}
|
|
|
|
[event]
|
|
name=prestart
|
|
|
|
# the array holding the recruit-limited types is cleared here, because
|
|
# it could hold values carried over from the previous scenario
|
|
|
|
{CLEAR_VARIABLE side_{SIDE}_limited_recruits}
|
|
|
|
{VARIABLE side_{SIDE}_limited_recruits_length -1}
|
|
[/event]
|
|
|
|
# when the side recruits this given type for the first time, it's recorded
|
|
# in an array that holds info on all the recruit-limited types for this side
|
|
|
|
[event]
|
|
name=recruit
|
|
first_time_only=yes
|
|
|
|
[filter]
|
|
side={SIDE}
|
|
type={TYPE}
|
|
[/filter]
|
|
|
|
{VARIABLE_OP side_{SIDE}_limited_recruits_length add 1}
|
|
|
|
{VARIABLE side_{SIDE}_limited_recruits[$side_{SIDE}_limited_recruits_length|].type $unit.type}
|
|
[/event]
|
|
|
|
# and every time when the side recruits this given type, we increment a
|
|
# counter, and if it matches or exceeds the limit, we disallow recruiting
|
|
# more of those units
|
|
|
|
[event]
|
|
name=recruit
|
|
first_time_only=no
|
|
|
|
[filter]
|
|
side={SIDE}
|
|
type={TYPE}
|
|
[/filter]
|
|
|
|
{FOREACH side_{SIDE}_limited_recruits i}
|
|
[if]
|
|
[variable]
|
|
name=side_{SIDE}_limited_recruits[$i].type
|
|
equals=$unit.type
|
|
[/variable]
|
|
|
|
[then]
|
|
{VARIABLE_OP side_{SIDE}_limited_recruits[$i].number_recruited add 1}
|
|
[if]
|
|
[variable]
|
|
name=side_{SIDE}_limited_recruits[$i].number_recruited
|
|
greater_than_equal_to={LIMIT_NUMBER}
|
|
[/variable]
|
|
|
|
[then]
|
|
[disallow_recruit]
|
|
side={SIDE}
|
|
type={TYPE}
|
|
[/disallow_recruit]
|
|
[/then]
|
|
[/if]
|
|
[/then]
|
|
[/if]
|
|
{NEXT i}
|
|
[/event]
|
|
#enddef
|
|
|
|
#define CAPTURE_FILTERED_VILLAGES SIDE FILTER
|
|
# Change ownership of villages matching the specified location filter.
|
|
[store_locations]
|
|
{FILTER}
|
|
variable=temp_target_villages
|
|
[/store_locations]
|
|
|
|
{FOREACH temp_target_villages i}
|
|
[capture_village]
|
|
side={SIDE}
|
|
x,y=$temp_target_villages[$i].x,$temp_target_villages[$i].y
|
|
[/capture_village]
|
|
{NEXT i}
|
|
|
|
{CLEAR_VARIABLE temp_target_villages}
|
|
#enddef
|
|
|
|
#define CAPTURE_VILLAGES_OF_TYPE TERRAIN SIDE X Y RADIUS
|
|
# Change ownership of the villages on a specified terrain type
|
|
# near a specified location.
|
|
{CAPTURE_FILTERED_VILLAGES {SIDE}
|
|
(
|
|
terrain={TERRAIN}
|
|
[and]
|
|
x,y={X},{Y}
|
|
radius={RADIUS}
|
|
[/and] ) }
|
|
#enddef
|
|
|
|
#define CAPTURE_VILLAGES SIDE X Y RADIUS
|
|
# Change ownership of all villages near a specified location.
|
|
{CAPTURE_VILLAGES_OF_TYPE (*^V*) {SIDE} {X} {Y} {RADIUS}}
|
|
#enddef
|
|
|
|
#define STARTING_VILLAGES SIDE RADIUS
|
|
# Macro to make a side start a scenario with villages.
|
|
# Creates an event, so it must be called from within the
|
|
# toplevel scenario tag. Also note that this relies on the
|
|
# side having a unit with canrecruit-yes at start; if it
|
|
# doesn't, you should use STARTING_VILLAGES_AREA instead.
|
|
[event]
|
|
name=prestart
|
|
|
|
[store_starting_location]
|
|
side={SIDE}
|
|
variable=temp_starting_location
|
|
[/store_starting_location]
|
|
|
|
{CAPTURE_VILLAGES {SIDE} $temp_starting_location.x $temp_starting_location.y {RADIUS}}
|
|
{CLEAR_VARIABLE temp_starting_location}
|
|
[/event]
|
|
#enddef
|
|
|
|
#define STARTING_VILLAGES_AREA SIDE X Y RADIUS
|
|
# Make a side start with ownership of villages in a given area.
|
|
# Creates an event, so it must be called from within the
|
|
# toplevel scenario tag.
|
|
[event]
|
|
name=prestart
|
|
|
|
{CAPTURE_VILLAGES {SIDE} {X} {Y} {RADIUS}}
|
|
[/event]
|
|
#enddef
|
|
|
|
#define STARTING_VILLAGES_ALL SIDE
|
|
# Make a side start with ownership of all villages.
|
|
# Creates an event, so it must be called from within the
|
|
# toplevel scenario tag.
|
|
[event]
|
|
name=prestart
|
|
|
|
{CAPTURE_FILTERED_VILLAGES {SIDE} (terrain=*^V*)}
|
|
[/event]
|
|
#enddef
|
|
|
|
#define TRANSFER_VILLAGE_OWNERSHIP FROM_SIDE TO_SIDE
|
|
# Transfers ownership of all villages of one side to another side. Useful
|
|
# when you're for example moving all units of some side to another, and want
|
|
# to transfer the village ownership as well.
|
|
[store_villages]
|
|
owner_side={FROM_SIDE}
|
|
variable=TRANSFER_VILLAGE_OWNERSHIP_villages
|
|
[/store_villages]
|
|
|
|
{FOREACH TRANSFER_VILLAGE_OWNERSHIP_villages TRANSFER_VILLAGE_OWNERSHIP_i}
|
|
[capture_village]
|
|
x,y=$TRANSFER_VILLAGE_OWNERSHIP_villages[$TRANSFER_VILLAGE_OWNERSHIP_i].x,$TRANSFER_VILLAGE_OWNERSHIP_villages[$TRANSFER_VILLAGE_OWNERSHIP_i].y
|
|
side={TO_SIDE}
|
|
[/capture_village]
|
|
{NEXT TRANSFER_VILLAGE_OWNERSHIP_i}
|
|
|
|
{CLEAR_VARIABLE TRANSFER_VILLAGE_OWNERSHIP_villages}
|
|
#enddef
|
|
|
|
# Persistant macros
|
|
|
|
#define MAKE_AI_SIDE_PERSISTENT SIDE
|
|
#Macro to make a ai controlled side persistent.
|
|
#Needs to be placed below the side definition.
|
|
[+side]
|
|
controller=human
|
|
persistent=yes
|
|
[/side]
|
|
|
|
[event]
|
|
name=prestart
|
|
[modify_side]
|
|
side={SIDE}
|
|
controller=ai
|
|
[/modify_side]
|
|
[/event]
|
|
[event]
|
|
name=victory
|
|
[modify_side]
|
|
side={SIDE}
|
|
controller=human
|
|
[/modify_side]
|
|
[/event]
|
|
#enddef
|
|
|
|
#define RECALL_AI_SIDE SIDE
|
|
#Recalls an ai side that is persistent (MAKE_AI_SIDE_PERSISTENT)
|
|
#Needs to be placed below the side definition.
|
|
{MAKE_AI_SIDE_PERSISTENT {SIDE}}
|
|
[event]
|
|
name=prestart
|
|
|
|
[store_unit]
|
|
variable=recall_ai_side_units_{SIDE}
|
|
[filter]
|
|
side={SIDE}
|
|
[/filter]
|
|
[/store_unit]
|
|
[/event]
|
|
[event]
|
|
name=victory
|
|
{CLEAR_VARIABLE recall_ai_side_units_{SIDE}}
|
|
[/event]
|
|
[event]
|
|
name=ai turn
|
|
|
|
[if]
|
|
[variable]
|
|
name=side_number
|
|
equals={SIDE}
|
|
[/variable]
|
|
[and]
|
|
[have_unit]
|
|
canrecruit=yes
|
|
side={SIDE}
|
|
[filter_location]
|
|
terrain=K*
|
|
[/filter_location]
|
|
[/have_unit]
|
|
[/and]
|
|
|
|
[then]
|
|
[store_gold]
|
|
side={SIDE}
|
|
[/store_gold]
|
|
|
|
[while]
|
|
[variable]
|
|
name=gold
|
|
greater_than=19
|
|
[/variable]
|
|
[variable]
|
|
name=recall_ai_side_units_{SIDE}.length
|
|
greater_than=0
|
|
[/variable]
|
|
[do]
|
|
[gold]
|
|
side=2
|
|
amount=-20
|
|
[/gold]
|
|
[store_gold]
|
|
side={SIDE}
|
|
[/store_gold]
|
|
[recall]
|
|
id=$recall_ai_side_units_{SIDE}[0].id
|
|
[/recall]
|
|
{CLEAR_VARIABLE recall_ai_side_units_{SIDE}[0]}
|
|
[/do]
|
|
[/while]
|
|
{CLEAR_VARIABLE gold}
|
|
[/then]
|
|
[/if]
|
|
[/event]
|
|
#enddef
|