A Shop Like Thing: Difference between revisions
Minor fixes. |
I will update it later. |
||
| Line 1: | Line 1: | ||
{{WML Tags}} | |||
== A Shop Like Thing == | == A Shop Like Thing == | ||
In this page you can see different tecniques of creating a shop. | |||
=== Simple === | |||
Use this macro to place a moveto event in your scenario that defines a magic-items shop. Argument is a [[StandardLocationFilter]]. | |||
Used macros: | |||
* VARIABLE_CONDITIONAL (from file [http://www.wesnoth.org/macro-reference.xhtml#file:utils.cfg utils.cfg]) | |||
* CLEAR_VARAIBLE (from file [http://www.wesnoth.org/macro-reference.xhtml#file:utils.cfg utils.cfg]) | |||
* WEAPON_SPECIAL_MAGICAL (from file[http://www.wesnoth.org/macro-reference.xhtml#file:abilities.cfg abilities.cfg]) | |||
#define | #define CREATE_SIMPLE_SHOP FILTER | ||
[event] | [event] | ||
name=moveto | name=moveto | ||
first_time_only=no | first_time_only=no | ||
[filter] | [filter] | ||
# this is not a macro. It is a argument token, | |||
# which will be substituted with argument value | |||
{FILTER} | {FILTER} | ||
[/filter] | [/filter] | ||
[store_gold] | [store_gold] | ||
side=$side_number | side=$side_number | ||
variable=gold | variable=css_gold | ||
# it is bad idea to use simple variable names like "gold" inside macro | |||
# because you can overwrite values of variables, | |||
# which was defined outside of this macro and was supposed to be used for | |||
# anything else. To prevent any side effects, preceed macro-specific variables | |||
# with abbreviation of macro name | |||
[/store_gold] | [/store_gold] | ||
# this is easiest way to create menu in the game. | |||
# you just define each value and player sees them anytime he trigger this event | |||
[message] | [message] | ||
speaker=narrator | speaker=narrator | ||
| Line 23: | Line 40: | ||
[option] | [option] | ||
message=_ "140 GP: Sharpen Melee Weapon, damage:+2" | message=_ "140 GP: Sharpen Melee Weapon, damage:+2" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 140} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-140 | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=attack | |||
# You need to specify filter for your effect | |||
# but you should't use [filter] tags | |||
# [filter] | |||
range=melee | |||
# [/filter] | |||
increase_damage=2 | |||
[/effect] | |||
[/object] | |||
[/ | |||
[/ | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 48: | Line 65: | ||
[option] | [option] | ||
message=_ "150 GP: Enchance Ranged Weapon, damage +2" | message=_ "150 GP: Enchance Ranged Weapon, damage +2" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 150} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
side=$side_number | |||
amount=-150 | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=attack | |||
# [filter] | |||
range=ranged | |||
# [/filter] | |||
increase_damage=2 | |||
[/effect] | |||
[/object] | |||
[/ | |||
[/ | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 73: | Line 88: | ||
[option] | [option] | ||
message=_ "150 GP: Crystal Orb, damage +2 on magical attack" | message=_ "150 GP: Crystal Orb, damage +2 on magical attack" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 150} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-150 | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=attack | |||
# [filter] | |||
special=chance_to_hit | |||
# [/filter] | |||
increase_damage=2 | |||
[/effect] | |||
[/object] | |||
[/ | |||
[/ | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
[option] | [option] | ||
message=_ "250 GP: Toughness Increase Scroll, HP+10" | message=_ "250 GP: Toughness Increase Scroll, Max HP+10" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 250} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-250 | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=hitpoints | |||
increase_total=10 | |||
[/effect] | |||
[/object] | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 122: | Line 131: | ||
[option] | [option] | ||
message=_ "400 GP: Seven-League Boots, gives MP of 10" | message=_ "400 GP: Seven-League Boots, gives MP of 10" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 400} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-400 | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=movement | |||
set=10 | |||
[/effect] | |||
[/object] | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 146: | Line 151: | ||
[option] | [option] | ||
message=_ "400 GP: Boot Upgrade, MP+1" | message=_ "400 GP: Boot Upgrade, MP+1" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 400} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-400 | |||
side=1 | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=movement | |||
increase=1 | |||
[/effect] | |||
[/object] | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 170: | Line 171: | ||
[option] | [option] | ||
message=_ "All GP: Healing Fountain, HP:+50" | message=_ "All GP: Healing Fountain, HP:+50" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 0} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-$css_gold | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=hitpoints | |||
increase=50 | |||
violate_max=1 | |||
[/effect] | |||
[/object] | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 195: | Line 192: | ||
[option] | [option] | ||
message=_ "300 GP: Rage Stone, add a melee swing" | message=_ "300 GP: Rage Stone, add a melee swing" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 300} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-300 | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=attack | |||
# [filter] | |||
range=melee | |||
# [/filter] | |||
increase_attacks=1 | |||
[/effect] | |||
[/object] | |||
[/ | |||
[/ | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 220: | Line 215: | ||
[option] | [option] | ||
message=_ "350 GP: Sight Stone, add a ranged attack" | message=_ "350 GP: Sight Stone, add a ranged attack" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 350} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-350 | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=attack | |||
# [filter] | |||
range=ranged | |||
# [/filter] | |||
increase_attacks=1 | |||
[/effect] | |||
[/object] | |||
[/ | |||
[/ | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 245: | Line 238: | ||
[option] | [option] | ||
message=_ "350 GP: Fire Scepter, adds 8-1 ranged magical fire" | message=_ "350 GP: Fire Scepter, adds 8-1 ranged magical fire" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 350} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-350 | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=new_attack | |||
name=Fire Scepter | |||
type=fire | |||
range=ranged | |||
[specials] | |||
{WEAPON_SPECIAL_MAGICAL} | |||
[/specials] | |||
damage=8 | |||
number=1 | |||
[/effect] | |||
[/object] | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
| Line 274: | Line 265: | ||
[option] | [option] | ||
message=_ "350GP: Ice Scepter, adds 8-1 ranged magical ice" | message=_ "350GP: Ice Scepter, adds 8-1 ranged magical ice" | ||
[show_if] | |||
{VARIABLE_CONDITIONAL gold greater_than 350} | |||
[/show_if] | |||
[command] | [command] | ||
[ | [gold] | ||
amount=-350 | |||
side=$side_number | |||
[/gold] | |||
[object] | |||
silent = yes | |||
[effect] | |||
apply_to=new_attack | |||
name=Ice Scepter | |||
type=cold | |||
range=ranged | |||
[specials] | |||
{WEAPON_SPECIAL_MAGICAL} | |||
[/specials] | |||
damage=8 | |||
number=1 | |||
[/effect] | |||
[/object] | |||
[/command] | [/command] | ||
[/option] | [/option] | ||
[/message] | [/message] | ||
{CLEAR_VARIABLE css_gold} | |||
[/event] | [/event] | ||
#enddef | #enddef | ||
=== Allow multiple choices in single dialog === | |||
In this example I show how to use infinite loop, which breaks when player chooses "exit" option. | |||
=== Optionally enter the shop === | |||
In this example I show how to use [set_menu_item] to allow player to decide: whether he want to enter the shop or not. | |||
=== Limit quantity of items === | |||
In this example I modify previous show with variables, indicating quantity of items in shop. Trivial options like "sharpen weapon" will be infinite. | |||
=== Limit number of uses per each unit === | |||
In this example I show how to limit infinite options for every unit entering the shop. | |||
=== Create random options === | |||
In this example I show how to use [insert_tag] to show options, created at runtime. | |||
The random option will be "Healing" with variable price and value. | |||
=== Allow user to track bought items === | |||
In this example I show how to create additional menu, which allow user to see: which items was bought for this unit. | |||
=== Allow to sell bought items === | |||
In this example I show how to sell items to the shop. | |||
== See Also == | == See Also == | ||
Revision as of 18:52, 23 October 2014
A Shop Like Thing
In this page you can see different tecniques of creating a shop.
Simple
Use this macro to place a moveto event in your scenario that defines a magic-items shop. Argument is a StandardLocationFilter.
Used macros:
- VARIABLE_CONDITIONAL (from file utils.cfg)
- CLEAR_VARAIBLE (from file utils.cfg)
- WEAPON_SPECIAL_MAGICAL (from fileabilities.cfg)
#define CREATE_SIMPLE_SHOP FILTER
[event]
name=moveto
first_time_only=no
[filter]
# this is not a macro. It is a argument token,
# which will be substituted with argument value
{FILTER}
[/filter]
[store_gold]
side=$side_number
variable=css_gold
# it is bad idea to use simple variable names like "gold" inside macro
# because you can overwrite values of variables,
# which was defined outside of this macro and was supposed to be used for
# anything else. To prevent any side effects, preceed macro-specific variables
# with abbreviation of macro name
[/store_gold]
# this is easiest way to create menu in the game.
# you just define each value and player sees them anytime he trigger this event
[message]
speaker=narrator
message=_ "What items would you like to purchase?"
image=wesnoth-icon.png
[option]
message=_ "140 GP: Sharpen Melee Weapon, damage:+2"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 140}
[/show_if]
[command]
[gold]
amount=-140
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=attack
# You need to specify filter for your effect
# but you should't use [filter] tags
# [filter]
range=melee
# [/filter]
increase_damage=2
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "150 GP: Enchance Ranged Weapon, damage +2"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 150}
[/show_if]
[command]
[gold]
side=$side_number
amount=-150
[/gold]
[object]
silent = yes
[effect]
apply_to=attack
# [filter]
range=ranged
# [/filter]
increase_damage=2
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "150 GP: Crystal Orb, damage +2 on magical attack"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 150}
[/show_if]
[command]
[gold]
amount=-150
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=attack
# [filter]
special=chance_to_hit
# [/filter]
increase_damage=2
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "250 GP: Toughness Increase Scroll, Max HP+10"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 250}
[/show_if]
[command]
[gold]
amount=-250
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=hitpoints
increase_total=10
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "400 GP: Seven-League Boots, gives MP of 10"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 400}
[/show_if]
[command]
[gold]
amount=-400
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=movement
set=10
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "400 GP: Boot Upgrade, MP+1"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 400}
[/show_if]
[command]
[gold]
amount=-400
side=1
[/gold]
[object]
silent = yes
[effect]
apply_to=movement
increase=1
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "All GP: Healing Fountain, HP:+50"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 0}
[/show_if]
[command]
[gold]
amount=-$css_gold
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=hitpoints
increase=50
violate_max=1
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "300 GP: Rage Stone, add a melee swing"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 300}
[/show_if]
[command]
[gold]
amount=-300
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=attack
# [filter]
range=melee
# [/filter]
increase_attacks=1
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "350 GP: Sight Stone, add a ranged attack"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 350}
[/show_if]
[command]
[gold]
amount=-350
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=attack
# [filter]
range=ranged
# [/filter]
increase_attacks=1
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "350 GP: Fire Scepter, adds 8-1 ranged magical fire"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 350}
[/show_if]
[command]
[gold]
amount=-350
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=new_attack
name=Fire Scepter
type=fire
range=ranged
[specials]
{WEAPON_SPECIAL_MAGICAL}
[/specials]
damage=8
number=1
[/effect]
[/object]
[/command]
[/option]
[option]
message=_ "350GP: Ice Scepter, adds 8-1 ranged magical ice"
[show_if]
{VARIABLE_CONDITIONAL gold greater_than 350}
[/show_if]
[command]
[gold]
amount=-350
side=$side_number
[/gold]
[object]
silent = yes
[effect]
apply_to=new_attack
name=Ice Scepter
type=cold
range=ranged
[specials]
{WEAPON_SPECIAL_MAGICAL}
[/specials]
damage=8
number=1
[/effect]
[/object]
[/command]
[/option]
[/message]
{CLEAR_VARIABLE css_gold}
[/event]
#enddef
Allow multiple choices in single dialog
In this example I show how to use infinite loop, which breaks when player chooses "exit" option.
Optionally enter the shop
In this example I show how to use [set_menu_item] to allow player to decide: whether he want to enter the shop or not.
Limit quantity of items
In this example I modify previous show with variables, indicating quantity of items in shop. Trivial options like "sharpen weapon" will be infinite.
Limit number of uses per each unit
In this example I show how to limit infinite options for every unit entering the shop.
Create random options
In this example I show how to use [insert_tag] to show options, created at runtime. The random option will be "Healing" with variable price and value.
Allow user to track bought items
In this example I show how to create additional menu, which allow user to see: which items was bought for this unit.
Allow to sell bought items
In this example I show how to sell items to the shop.