Scripting suggestions (Lua, (V)ERM)

#1

It is time to start collecting scripting features actually needed by mod authors. Small (but complete) script examples would be ideal.

pinned globally #2
#3

Very enigmatic topic:) Is it topic rather for modders oraz rather for people who can write anything using Lua or ERM?

#4

This topic is mostly for modders, I`d like to see a list of features they want to be implemented first.

#5

WoG script 69: Market of Time - building that let player forget secondary skill for a fee.
(still I don’t know if I understand topic correctly -sorry)

#6

Are special buildings bonuses can be implemented? Like primary skill for visiting hero or bonus during siege?

#7

Looks like a good example at first glance - not to many different receivers and no dirty hacks (like UN:C).

You understand it correctly, just try to give more simple examples.

Custom buildings as a solid feature is next goal after scripts. But it might be possible to with standalone scripts earlier.

#8

‘Enhanced’ Cartographer reveals only terrain on which cartograph stands. So if cartograph is placed on grass, reveals only grass terrains, not whole map.

ZVSE
ERMS_PoweredBy=ERM Scripter v. 2004.10.5.945
_WARNING_#1=IMPORTANT! This file is not in a plain text format. NEVER use any editor except ERM_S for making any kind of changes!
ERMS_ScriptName=Ulepszony Kartograf
ERMS_ScriptAuthor=Altair
ERMS_ScriptVersion=1.0.0
ERMS_ScriptDate=13.11(November).2006
ERMS_ScriptERMVersion=2.70



!?OB13;
!!TRv998/v999/v1000:T?v62/?y1/?y1/?y1/?y1/?y1/?y1/?y1;
!!UN:X?v60/?v61;
!!VRv61:+1;
!!OW:C?y8;
!!OW:R-1/6/?y70;
!!VRy71:Sy8+1;

!!VRy71&y8=2:S4;
!!VRy71&y8=3:S8;
!!VRy71&y8=4:S16;
!!VRy71&y8=5:S32;
!!VRy71&y8=6:S64;
!!VRy71&y8=7:S128;


!!POv998/v999/v1000:V1/?y6;

!!VRy7:Sy6;
!!VRy7:&y71;

!!IF&1000/y7<1/y70>=1000:Q3^You meet a Cartographer selling maps for 1000 gold. Do you want to buy a map?^;
!!IF&1000/y7>0:M^I showed you all my maps and now go away.^;
!!IF&1000/y7=0/y70<1000:M^My maps cost 1000 gold. However, it looks like you can't afford it, so don't waste my time.^;

!!OW&1000/3/y70>=1000/y7<1:R-1/6/d-1000;
!!OW&-1000/y70>=1000/y7<1:R-1/6/d-1000;

!!VRy6:|y71;

!!POv998/v999/v1000&1000/3/y70>=1000/y7<1:V1/y6;
!!POv998/v999/v1000&-1000/y70>=1000/y7<1:V1/y6;

!!DO699/0/v61/1&1000/3/y70>=1000/y7<1:P;
!!DO699/0/v61/1&-1000/y70>=1000/y7<1:P;


!!OB998:S;
!?FU699;
!!DO700/0/v60/1:Px16;



!?FU700;
!!OW:C?y8;
!!DO701/0/v60/1:Px16/x1/y8;

!?FU701;

!!TRx16/x1/x2:T?y7/?y1/?y1/?y1/?y1/?y1/?y1/?y1;
!!UN&y7=v62:Sx16/x1/x2/x3/0;
#9

Heroes with peasants in army get 2 gold per day for every peasant.

ZVSE
!#VRz842:S^Pays taxes.^; 
!#UN:G1/139/2/z842;

!#TM15:S1/999/1/255; 
 
!?TM15; 
!!DO150/0/155/1:P; 
 
!?FU150; 
!!OW:C?y1; ** check current player 
!!HEx16:O?y2; ** check owner 
!!DO151/0/6/1&y1=y2:Px16/y2; 
 
!?FU151; 
!!HEx1:C0/x16/?y1/?y2; 
!!VRy3&y1=139:Sy2*2; 
!!VRy3&y1<>139:S0; 
!!OW:Rx2/6/dy3;
#10

Last two examples are not sugestions, just simple and complete erm scripts.

#11

This is kind of evil for VCMI, reveal tiles one by one may be too slow.

This is where I have questions. How object visit receiver should look in VCMI?

!?OBxxx; !?OBxxx/xxx; - like ERM (but it will work for modded objects if you resolve numeric id)
!?OB^handlerName^; - by handler name
!?OB^objectGroup^; !?OB^objectGroup^/^objectType^; - by json keys for type/subtype 

This looks promising, I`ll start with this one.

#12

This will take … some time, but I can show how it it should look as a mod.

#13

There are some (simple I think) lua scripts written for wog 3.59 by GrayFace.

#14

ERM scripts in 3.59 are not simpler than 3.58, Lua API from WoG is completely irrelevant for VCMI.

#15

Another simple script from [quote=“AVS, post:11, topic:5207”]
This is where I have questions. How object visit receiver should look in VCMI?

!?OBxxx; !?OBxxx/xxx; - like ERM (but it will work for modded objects if you resolve numeric id)
!?OB^handlerName^; - by handler name
!?OB^objectGroup^; !?OB^objectGroup^/^objectType^; - by json keys for type/subtype 

I think by json keys for type/subtype.

#16

Another smaller script from ERA.
Conflux rebalacing.

Growth Pixie/Sprite: 15,
Growth of all Elementals: 5,
Firebirds/Phoenixes are treated as ‘elementals’.

ZVSE
ERMS_ScriptDate=2.10(October).2012
_WARNING_#1=IMPORTANT! This file is not in a plain text format. NEVER use any editor except ERM_S for making any kind of changes!
ERMS_PoweredBy=ERM Scripter v. 2004.10.5.945
** Author orig.  : Algor
** Name          : Conflux balancing
** Name rus.     : Áŕëŕíńčđîâęŕ Ńîďđ˙ćĺíč˙
** Options       : 781
** Dialogs       : -
** Variables     : -
** Tmp variables : -
** Timers        : -
** Functions     : -
** PO-values     : -

!?PI;                         [ďîńň-číńňđóęöč˙]
!!UN:P781/?y1;                [ďđîâĺđ˙ĺě âęëţ÷ĺíŕ ëč îďöč˙ 781 â y1]
!!FU&y1=0:E;                  [âűőîä ĺńëč îďöč˙ íĺ âęëţ÷ĺíŕ]
!!MA:G118/?y11 G119/?y12 G112/?y13 G127/?y14 G115/?y15 G123/?y16 G113/?y17 G125/?y18; [y11-y18 ďđčđîńňű Ôĺé,AWE-Ýëĺěĺíňŕëĺé]
!!VRy11:-5;                   [čçěĺí˙ĺě ďđčđîńňű äî íóćíűő çíŕ÷ĺíčé]
!!VRy12:-5;                   [...]
!!VRy13:-1;                   [...]
!!VRy14:-1;                   [...]
!!VRy15:-1;                   [...]
!!VRy16:-1;                   [...]
!!VRy17:+1;                   [...]
!!VRy18:+1;                   [...]
!!VRy11&y11<1:S1;             [íĺ äŕĺě čě îďóńęŕňüń˙ íčćĺ 1]
!!VRy12&y12<1:S1;             [...]
!!VRy13&y13<1:S1;             [...]
!!VRy14&y14<1:S1;             [...]
!!VRy15&y15<1:S1;             [...]
!!VRy16&y16<1:S1;             [...]
!!MA:G118/y11 G119/y12 G112/y13 G127/y14 G115/y15 G123/y16 G113/y17 G125/y18; [Îáíîâëĺíčĺ ďđčđîńňîâ: Ôĺč-15, AWFE-Ýëĺěĺíňŕëč-5]
!!MA:X130/?y1;                [y1 - ôëŕăč îăí. ďňčö]
!!VRy2:Sy1 &16;               [ďîëó÷ŕĺě ôëŕă "ćčâîĺ ńóůĺńňâî"]
!!VRy1:-y2;                   [óáčđŕĺě ôëŕă "ćčâîĺ ńóůĺńňâî"]
!!VRy1:|131072;               [óńňŕíŕâëčâŕĺě ôëŕă "ýëĺěĺíňŕëü"]
!!MA:X130/y1;                 [îáíîâë˙ĺě ôëŕă îăí. ďňčö]
!!MA:X131/?y1;                [y1 - ôëŕăč ôĺíčęńîâ]
!!VRy2:Sy1 &16;               [ďîëó÷ŕĺě ôëŕă "ćčâîĺ ńóůĺńňâî"]
!!VRy1:-y2;                   [óáčđŕĺě ôëŕă "ćčâîĺ ńóůĺńňâî"]
!!VRy1:|131072;               [óńňŕíŕâëčâŕĺě ôëŕă "ýëĺěĺíňŕëü"]
!!MA:X131/y1;                 [îáíîâë˙ĺě ôëŕă ôĺíčęńîâ]

** end
#17

Not that useful for VCMI, if you just changing particular entities in !?PI it is better to use JSON. However it should work with a few exceptions:

  • !!UN:P - not planned for now, may be in feature.
  • !!MA:X/16 - aka Living trait is not present in VCMI, I`ve ignored it for now. Could be done as “not NON_LIVING”
#18

Another examples:

Creatures placed in town garrisons grow their count by 2% every day
Map dwellings have 25% chance to offer upgraded creatures
Neutral armies are supplied with neutral heroes with some of stats and spells for the time of battle
Speed reverse - slow creatures get huge speed while fast such as archangels / phoenixes etc. get very slow (speed 3 or similar)
Neutral creatures in battle get +10% boost to all statistics every month (fighting pikemen in 2nd month results in them having 11 hitpoitns instead of 10 etc.)

I do not try to give wanted/practical scripts, but “various different kinds” ones.

#19

If these scripts are not wanted/practical, then they should be simple enough to be used as tests (like that one with !!MA, you sent me some time ago).

#20

Magog Fireball-Attack does not damage own troops - script by PerryR

ZVSE

!?MF1;                                  [Magogs Fireball-Attack doesnt damage own troops]
!!SN:W^Magog_Fireball_Enable^/?y1;
!!FU&y1=0:E;
!!BG:N?y1;                              [Get attacking stack number]
!!MF:N?y4;                              [Get defending stack number]
!!BMy1:I?y5;                            [Get attacking stack side]
!!BMy4:I?y6;                            [Get defending stack side]
!!UN:C42149568/4/?y10;                  [Judgement basis (028326c0)]
!!MF&y10=4454752/y5=y6:E0;              [Disable taking damage if Magog Fireball and own team]

!?MR2;                                  [Magogs Fireball-Cast that comes with Stack Expierence doesnt damage own troops]

!!SN:W^Magog_Fireball_Enable^/?y1;
!!FU&y1=0:E;
!!BG:A?y1;                              [Aktion in y1]
!!MR:S?y2 F?y3;
!!if&y1=7/y2=21/y3<=105:;               [Fireball always does 105 damage]
!!MR:N?y10;
!!BMy10:I?y11;
!!MR&y11=0:F100;                        [Disable Magic damage for attacker side from Fireball]
!!en;


!?FU(OnBattleRegeneratePhase);
!!SN:W^Magog_Fireball_Switch^/-1;
!!BA:Q?y1;
!!FU&y1=1:E;                            [Exit in Quick Combat]

!!SN:X?y1;                              [Event parameter]
!!BMy1:T?y2;                            [Acting Monster Type]
!!SN&y2=45:W^Magog_Fireball_Switch^/y1;

!?CM4;
*Show choice in Battle when right clicking defend icon
!!CM:F?y1 I?y2;
!!FU|y1<>512/y2<>2010:E;                [Exit if not rightclick on defend Icon]
!!SN:W^Magog_Fireball_Switch^/?y3;
!!FU&y3=-1:E;
!!BMy3:T?y4;                            [Acting Monster Type]
!!if&y4=45:;

!!VRz1:S^Should the Magog Fireball attack damage own troops^;
!!VRz2:S^Yes^;
!!VRz3:S^No^;

!!VRv3:S0;
!!IF:G1/3/0/1/2/3/0/0/0/0/0/0/0/0/0/;
!!SN&v3=1:W^Magog_Fireball_Enable^/0;
!!SN&v3=2:W^Magog_Fireball_Enable^/1;
!!en:;

!?BA0;
!!SN:W^Magog_Fireball_Enable^/1;

Yes, I know - UN:C :frowning: