mirror of
https://github.com/wesnoth/wesnoth
synced 2025-04-17 20:51:11 +00:00
465 lines
20 KiB
INI
465 lines
20 KiB
INI
#textdomain wesnoth-tsg
|
||
|
||
#######################################################################################################################################################
|
||
# HELPER MACROS
|
||
#######################################################################################################################################################
|
||
#define TUTORIAL_ARROW X Y
|
||
[item]
|
||
name=arrow
|
||
x,y={X},{Y}
|
||
image=misc/highlight-hex.png
|
||
halo=misc/arrow[10~19,20~11].png
|
||
[/item]
|
||
#enddef
|
||
#define REMOVE_ARROW
|
||
[remove_item]
|
||
image=arrow
|
||
[/remove_item]
|
||
#enddef
|
||
|
||
#define UNDO_REMINDER
|
||
[message]
|
||
speaker=narrator
|
||
caption= _"Undo"
|
||
image=wesnoth-icon.png
|
||
message= _"Tip: Press “u” if you ever want to undo a move. Attacks cannot be undone."
|
||
[/message]
|
||
[cancel_action][/cancel_action]
|
||
[allow_undo][/allow_undo]
|
||
#enddef
|
||
|
||
#define TALK_ABOUT ID_STRING MESSAGE_TEXT
|
||
[scroll_to_unit]
|
||
id={ID_STRING}
|
||
highlight=yes
|
||
[/scroll_to_unit]
|
||
[message]
|
||
id=Mari,Sir Gerrick,Minister Hylas
|
||
scroll=no
|
||
highlight=no
|
||
message={MESSAGE_TEXT}
|
||
[/message]
|
||
#enddef
|
||
|
||
#define TALK_ABOUT_LOC POSITION MESSAGE_TEXT
|
||
[scroll_to]
|
||
x,y={POSITION}
|
||
highlight=yes
|
||
[/scroll_to]
|
||
[message]
|
||
id=Mari,Sir Gerrick,Minister Hylas
|
||
scroll=no
|
||
highlight=no
|
||
message={MESSAGE_TEXT}
|
||
[/message]
|
||
#enddef
|
||
|
||
#######################################################################################################################################################
|
||
# EXPLAIN ADVANCEMENTS
|
||
#######################################################################################################################################################
|
||
|
||
#############################
|
||
# GENERIC ADVANCEMENTS
|
||
#############################
|
||
#define SG_HELP_EVENTS_1
|
||
[event]
|
||
name=post_advance
|
||
{FILTER side=1}
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{VARIABLE_CONDITIONAL sg_advancements not_equals yes}
|
||
)}
|
||
[message]
|
||
speaker=unit
|
||
message=_"I have reached max XP, and advanced a level! I am now significantly more powerful, and have been fully healed!
|
||
|
||
For a full description of everything I can do, <b><i>right-click me and select “Unit Description.”</i></b>"
|
||
[/message]
|
||
{VARIABLE sg_advancements yes}
|
||
[/event]
|
||
|
||
#######################################################################################################################################################
|
||
# EXPLAIN TURN LIMIT
|
||
#######################################################################################################################################################
|
||
[event]
|
||
name=explain_turn_limit
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{VARIABLE_CONDITIONAL sg_turns_explained not_equals yes}
|
||
)}
|
||
[display_tip]
|
||
title=_"Turn Limits"
|
||
image=tutor/turns.png
|
||
message=_"
|
||
Most scenarios have a turn limit, as
|
||
shown in the upper-left-hand corner.
|
||
Usually, running out of turns will
|
||
result in defeat — check your
|
||
<i><b>objectives</b></i> by clicking the <i><b>“Menu”</b></i>
|
||
button in the top-left corner
|
||
(or use the hotkey <i><b>Ctrl+J</b></i>).
|
||
|
||
Finishing early will usually reward
|
||
a gold boost (“early finish bonus”)
|
||
in the next scenario, so don’t delay!"
|
||
[/display_tip]
|
||
{VARIABLE sg_turns_explained yes}
|
||
[/event]
|
||
|
||
#######################################################################################################################################################
|
||
# UNITS AND ATTACKS
|
||
#######################################################################################################################################################
|
||
#############################
|
||
# HIGHLIGHT MISSES
|
||
#############################
|
||
# when I first started Wesnoth, it wasn't always clear why my units wouldn't deal any damage
|
||
# I noticed this same pattern in a couple of new players who I had try out this campaign
|
||
# hopefully this indicator helps make it a little more clear what's happening
|
||
# (and hopefully this doesn't make other campaigns without this indicator confusing)
|
||
[event]
|
||
name=attacker misses
|
||
first_time_only=no
|
||
{FILTER_CONDITION( {VARIABLE_CONDITIONAL enable_tutorial_elements equals yes} )}
|
||
[floating_text]
|
||
x,y=$second_unit.x,$second_unit.y
|
||
text=_"<span size='x-small'>Miss</span>"
|
||
[/floating_text]
|
||
[/event]
|
||
[event]
|
||
name=defender misses
|
||
first_time_only=no
|
||
{FILTER_CONDITION( {VARIABLE_CONDITIONAL enable_tutorial_elements equals yes} )}
|
||
[floating_text]
|
||
x,y=$unit.x,$unit.y
|
||
text=_"<span size='x-small'>Miss</span>"
|
||
[/floating_text]
|
||
[/event]
|
||
|
||
#############################
|
||
# HEALERS CAN'T HEAL THEMSELVES
|
||
#############################
|
||
[event]
|
||
name=new turn
|
||
[filter_condition]
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{VARIABLE_CONDITIONAL sg_selfheal_info not_equals yes}
|
||
[have_unit]
|
||
id=Ethiliel,Hylas {NOT race=mechanical}
|
||
formula=(self.hitpoints < self.max_hitpoints/2)
|
||
[/have_unit]
|
||
[/filter_condition]
|
||
[message]
|
||
id=Ethiliel,Hylas {NOT race=mechanical}
|
||
formula=(self.hitpoints < self.max_hitpoints/2)
|
||
message=_"My healing magic is potent, but I cannot use it to heal myself. I’ll have to end my turn on a village to recover."
|
||
[/message]
|
||
{VARIABLE sg_selfheal_info yes}
|
||
[/event]
|
||
|
||
#############################
|
||
# RANGED ATTACK
|
||
#############################
|
||
[event]
|
||
name=attack end
|
||
{FILTER side=1}
|
||
{FILTER_ATTACK range=ranged}
|
||
{FILTER_SECOND( type_adv_tree=Quintain,Thug,Thief,Walking Corpse,Ghoul,Skeleton )}
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{VARIABLE_CONDITIONAL sg_ranged_info not_equals yes}
|
||
)}
|
||
{VARIABLE sg_ranged_info yes}
|
||
[message]
|
||
speaker=unit
|
||
message=_"I just made a <i><b>ranged attack</b></i>! I had to stand right next to this $second_unit.language_name <i>(yes, this is different from how most games handle ranged attacks)</i>, but because the $second_unit.language_name has no ranged weapon of his own he was unable to retaliate."
|
||
[/message]
|
||
[/event]
|
||
#enddef
|
||
|
||
#############################
|
||
# UNIT TYPES
|
||
#############################
|
||
#define EXPLAIN_UNIT_TYPE VAR FLT IMAGE MESSAGE
|
||
[event]
|
||
name=moveto
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{HAVE_UNIT( side=1 {FILTER_ADJACENT {FLT}}
|
||
{VARIABLE_CONDITIONAL sg_{VAR}_info not_equals yes}
|
||
)})}
|
||
{VARIABLE sg_{VAR}_info yes}
|
||
[message]
|
||
speaker=narrator
|
||
image={IMAGE}
|
||
{TUTOR: {MESSAGE}}
|
||
[/message]
|
||
[/event]
|
||
#enddef
|
||
|
||
#define SG_HELP_EVENTS_2
|
||
# {EXPLAIN_UNIT_TYPE
|
||
# thug type_adv_tree=Thug
|
||
# "units/human-outlaws/thug-melee-3.png~RC(magenta>blue)"
|
||
# _"Thugs are the mainstay of the bandit rings. They are powerful in melee combat, but do not have a <i>ranged</i> attack and thus cannot retaliate against archers. Like all outlaw units, they are much more dangerous at night due to having the <b>chaotic</b> alignment."
|
||
# }
|
||
# {EXPLAIN_UNIT_TYPE
|
||
# thief type_adv_tree=Thief
|
||
# "units/human-outlaws/thief-defend-2-2.png~RC(magenta>blue)"
|
||
# _"Thieves are weak in one-on-one combat, but can be deadly if you allow them to surround your units. On offense, thieves will deal double damage when they have an ally directly behind the unit they are attacking! Like thugs, thieves are vulnerable to ranged attacks."
|
||
# }
|
||
# {EXPLAIN_UNIT_TYPE
|
||
# footpad type_adv_tree=Footpad
|
||
# "units/human-outlaws/footpad+female-attack1.png~RC(magenta>blue)"
|
||
# _"Footpads are the scouts of the bandit rings. They are highly mobile, and have both a <i>melee</i> attack and a <i>ranged</i> attack, although neither of their attacks is very strong. Footpads are difficult to hit with regular attacks, but will take bonus damage from <i>blade</i>, <i>impact</i>, or <i>pierce</i> weapons and can be easily killed during the day."
|
||
# }
|
||
# {EXPLAIN_UNIT_TYPE
|
||
# corpse type_adv_tree="Walking Corpse"
|
||
# "units/undead/zombie-attack-s.png~RC(magenta>black)"
|
||
# _"Walking corpses are usually used by weaker practitioners of the black arts, who pilfer dead bodies to practice their profane magic. Alone, they are slow and weak, although they can become dangerous in large groups. Any unit slain by a Walking Corpse will be plagued with undeath and become one as well."
|
||
# }
|
||
# {EXPLAIN_UNIT_TYPE
|
||
# ghoul type_adv_tree=Ghoul
|
||
# "units/undead/ghoul-attack-3.png~RC(magenta>red)"
|
||
# _"Ghouls are abominations of flesh with considerable durability and festering with disease. While their raw damage output is low, their <i>poison</i> attacks can cripple your units. <i><b>Use healers or villages to cure poison!</b></i>"
|
||
# }
|
||
# {EXPLAIN_UNIT_TYPE
|
||
# skeleton type_adv_tree=Skeleton,"Skeleton Archer"
|
||
# "units/undead-skeletal/skeleton/skeleton-se-melee2.png~RC(magenta>black)"
|
||
# _"Skeletons are the bones of fallen warriors reanimated by dark sorcery. They are almost immune to <i>pierce</i> weapons like arrows and spears, but are especially vulnerable to <i>impact</i> weapons. Like bandits, they are much more dangerous at night!"
|
||
# }
|
||
#
|
||
# {EXPLAIN_UNIT_TYPE
|
||
# skeleton type_adv_tree=Lich
|
||
# "units/undead-necromancers/lich-magic-2.png~RC(magenta>black)"
|
||
# _"A lich is the physical embodiment of evil: the mind and spirit of a dead necromancer, bound to their undead bones. This powerful level 3 unit wields powerful <i>magical</i> ranged attacks, and drains health from its victims in melee. Like other undead, liches are much more dangerous at night!"
|
||
# }
|
||
|
||
[event]
|
||
name=attack,select
|
||
{FILTER_SECOND type=Peasant,Woodsman}
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{VARIABLE_CONDITIONAL sg_peasant_info not_equals yes}
|
||
)}
|
||
{VARIABLE sg_peasant_info yes}
|
||
[message]
|
||
speaker=narrator
|
||
image=units/human-peasants/peasant-attack2.png~RC(magenta>wesred)
|
||
{TUTOR: _"Peasants and Woodsmen form the backbone of the rural economy. Frail and vulnerable, these are the Wesnoth armies’ soldiers of last resort.
|
||
|
||
Like Walking Corpses, Peasants and Woodsmen are level 0 units. They do not exert a Zone of Control, allowing enemies to move around them unhindered."}
|
||
[/message]
|
||
[/event]
|
||
|
||
[event]
|
||
name=attack_end
|
||
{FILTER side=1}
|
||
{FILTER_ATTACK type=pierce}
|
||
{FILTER_SECOND( type_adv_tree=Skeleton,Skeleton Archer )}
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{VARIABLE_CONDITIONAL sg_pierce_info not_equals yes}
|
||
{VARIABLE_CONDITIONAL second_unit.hitpoints greater_than 0}
|
||
)}
|
||
{VARIABLE sg_pierce_info yes}
|
||
[message]
|
||
speaker=unit
|
||
message= _ "Our bows and spears are nearly useless against these skeletons! They have nothing for our shafts to pierce but air!"
|
||
[/message]
|
||
[message]
|
||
speaker,image=narrator,wesnoth-icon.png
|
||
{TUTOR: _"To see what damage resistances and vulnerabilities a unit has, right-click it and select “Unit Description.”"}
|
||
[/message]
|
||
[/event]
|
||
|
||
#######################################################################################################################################################
|
||
# EXPERIENCE AND VETERANS
|
||
#######################################################################################################################################################
|
||
#############################
|
||
# HIGH-XP UNIT DIES
|
||
#############################
|
||
[event]
|
||
name=last breath
|
||
[filter]
|
||
side,formula=1,"if( (self.experience+8)>=self.max_experience and self.experience<self.max_experience, 1, 0 )"
|
||
{OR( side,level=1,2-99 {NOT canrecruit=yes} {NOT trait=loyal} )} # don't trigger this for units who're likely to have death events
|
||
[/filter]
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{VARIABLE_CONDITIONAL sg_veteran_death not_equals yes}
|
||
)}
|
||
[message]
|
||
speaker=unit
|
||
message=_"Alas, I perish! And with me, all my hard-won battle experience is lost."
|
||
[/message]
|
||
[event]
|
||
name=die
|
||
{SAY_COMPANION
|
||
MESSAGE_GENERIC=_"You will be missed, my veteran friend! If only we had kept him safe, he could have been a valuable asset in our fight." #possible but unlikely this is a female mage
|
||
}
|
||
{VARIABLE sg_veteran_death yes}
|
||
[/event]
|
||
[/event]
|
||
#enddef
|
||
|
||
#######################################################################################################################################################
|
||
# RNG AND LUCK
|
||
#######################################################################################################################################################
|
||
#define NOT_FIRST_MISSION
|
||
{NOT({HAVE_UNIT type=quintain })} )}
|
||
{NOT({HAVE_UNIT id="Urza Mathin"})} )}
|
||
#enddef
|
||
|
||
#define SG_HELP_EVENTS_3
|
||
#############################
|
||
# TRACK HITS-AND-MISSES
|
||
#############################
|
||
[event]
|
||
name,first_time_only=pre attack,no
|
||
{VARIABLE consecutive_hits 0}
|
||
{VARIABLE consecutive_misses 0}
|
||
[/event]
|
||
[event]
|
||
name,first_time_only=attacker hits,no
|
||
{VARIABLE_OP consecutive_hits add 1}
|
||
[/event]
|
||
[event]
|
||
name,first_time_only=attacker misses,no
|
||
{VARIABLE_OP consecutive_misses add 1}
|
||
[/event]
|
||
[event]
|
||
name=victory
|
||
{CLEAR_VARIABLE consecutive_hits,consecutive_misses}
|
||
[/event]
|
||
|
||
#############################
|
||
# PLAYER MISSES ALL STRIKES (EXPECTED)
|
||
#############################
|
||
# display each of these RNG tips in order - 1, 2, 3, 4. So they're more likely to be spread out across several scenarios
|
||
[event]
|
||
name=attack end
|
||
{FILTER side=1} {FILTER_ATTACK({NOT special_id=magical})} {FILTER_SECOND defense=0-40}
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{NOT_FIRST_MISSION}
|
||
{VARIABLE_CONDITIONAL consecutive_misses greater_than 2 }
|
||
{VARIABLE_CONDITIONAL consecutive_hits equals 0 }
|
||
{VARIABLE_CONDITIONAL sg_rnginfo_1 not_equals yes}
|
||
)}
|
||
[message]
|
||
speaker=unit
|
||
#po: $consecutive_misses will be 3 or higher. Alternatively, can be translated along the lines of "I missed all my strikes!"
|
||
message= _ "I missed all $consecutive_misses strikes! I tried my best, but this enemy had high dodge, and I also got unlucky. I might have had better odds attacking a different enemy."
|
||
[/message]
|
||
[message]
|
||
speaker=unit
|
||
message= _ "A good commander understands the odds, and knows how to both exploit good luck and mitigate bad luck. After all, both good and bad luck are equally likely!"
|
||
[/message]
|
||
[display_tip]
|
||
title=_"Managing Luck"
|
||
image=tutor/luck.png
|
||
message=_"Wesnoth is a game about flexible strategy,
|
||
not deterministic calculation.
|
||
Anyone can win when things go as planned.
|
||
Wesnoth’s skill & mastery lie in creating
|
||
a strategy that <i><b>mitigates bad luck</b></i>, while
|
||
simultaneously <i><b>exploits good luck</b></i>. Both
|
||
bad and good luck are inevitable, so be
|
||
ready to handle both!
|
||
|
||
Expert players are so skilled at this that
|
||
they can prevail in every campaign on even
|
||
the highest difficulty, without save-loading!
|
||
|
||
That said, if you really prefer a more
|
||
deterministic experience, try selecting
|
||
<i><b>“Reduced RNG”</b></i> when starting a new
|
||
campaign."
|
||
[/display_tip]
|
||
{VARIABLE sg_rnginfo_1 yes}
|
||
[/event]
|
||
|
||
#############################
|
||
# PLAYER HITS MANY STRIKES (EXPECTED)
|
||
#############################
|
||
[event]
|
||
name=attack end
|
||
{FILTER side=1} {FILTER_ATTACK({NOT special_id=magical})} {FILTER_SECOND defense=60-100}
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{NOT_FIRST_MISSION}
|
||
{VARIABLE_CONDITIONAL consecutive_hits greater_than 2 }
|
||
{VARIABLE_CONDITIONAL consecutive_misses equals 0 }
|
||
{VARIABLE_CONDITIONAL sg_rnginfo_1 equals yes}
|
||
{VARIABLE_CONDITIONAL sg_rnginfo_2 not_equals yes}
|
||
)}
|
||
[message]
|
||
speaker=unit
|
||
#po: $consecutive_hits will be 3 or higher. Alternatively, can be translated along the lines of "I got lucky and hit all my strikes!"
|
||
message= _ "I got lucky and hit all $consecutive_hits strikes! Good luck will sometimes happen, but a good commander knows how to win without relying on it. After all, bad luck happens just as often as good luck!"
|
||
[/message]
|
||
{VARIABLE sg_rnginfo_2 yes}
|
||
[/event]
|
||
|
||
#############################
|
||
# PLAYER MISSES ALL STRIKES (UNEXPECTED)
|
||
#############################
|
||
[event]
|
||
name=attack end
|
||
{FILTER side=1} {FILTER_ATTACK({NOT special_id=magical})} {FILTER_SECOND defense=60-100}
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{NOT_FIRST_MISSION}
|
||
{VARIABLE_CONDITIONAL consecutive_misses greater_than 2 }
|
||
{VARIABLE_CONDITIONAL consecutive_hits equals 0 }
|
||
{VARIABLE_CONDITIONAL sg_rnginfo_2 equals yes}
|
||
{VARIABLE_CONDITIONAL sg_rnginfo_3 not_equals yes}
|
||
)}
|
||
[message]
|
||
speaker=unit
|
||
message= _ "I missed all $consecutive_misses strikes, even though my enemy had low dodge! That’s unlucky, but bad luck happens just as often as good luck — a good commander knows how to plan around both!"
|
||
[/message]
|
||
{VARIABLE sg_rnginfo_3 yes}
|
||
[/event]
|
||
|
||
#############################
|
||
# PLAYER HITS MANY STRIKES (UNEXPECTED)
|
||
#############################
|
||
[event]
|
||
name=attack end
|
||
{FILTER side=1} {FILTER_ATTACK({NOT special_id=magical})} {FILTER_SECOND defense=0-50}
|
||
{FILTER_CONDITION(
|
||
{VARIABLE_CONDITIONAL enable_tutorial_elements equals yes}
|
||
{NOT_FIRST_MISSION}
|
||
{VARIABLE_CONDITIONAL consecutive_hits greater_than 2 }
|
||
{VARIABLE_CONDITIONAL consecutive_misses equals 0 }
|
||
{VARIABLE_CONDITIONAL sg_rnginfo_3 equals yes}
|
||
{VARIABLE_CONDITIONAL sg_rnginfo_4 not_equals yes}
|
||
)}
|
||
[message]
|
||
speaker=unit
|
||
message= _ "I hit all $consecutive_hits strikes, even though my enemy had high dodge! Luck works both ways — sometimes I miss strikes when I was likely to hit, but sometimes I also hit strikes that I was likely to miss — like now!"
|
||
[/message]
|
||
{VARIABLE sg_rnginfo_4 yes}
|
||
[/event]
|
||
|
||
#enddef
|
||
|
||
#define S06_SACRIFICIAL_LAMB_TIP
|
||
[display_tip]
|
||
title=_"Sacrificial Lambs"
|
||
image=tutor/lambs.png
|
||
message=_"In challenging scenarios, it's often
|
||
impossible to protect every unit.
|
||
|
||
Instead of sending your veterans
|
||
straight into the meatgrinder, it's
|
||
often best to use them alongside
|
||
fresh recruits or disposable units.
|
||
|
||
Doing so can help spare your
|
||
veterans from the worst of the
|
||
enemy's attacks."
|
||
[/display_tip]
|
||
#enddef
|