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.