Difference between revisions of "A Shop Like Thing"
(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
Contents
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.