v0.8.9 (Bugfixes + translations) released to Google Play!

Useful links
Source code of the game - Contribution guide - ATCS Editor - Translate the game on Weblate - Example walkthrough - Andor's Trail Directory - Join the Discord
Get the game (v0.8.9) from Google, F-Droid, our server, or itch.io

AT Scripting Language documentation

Discussions of the development process of the game.
User avatar
Zukero
Lead Developer
Posts: 2028
Joined: Thu Jul 21, 2011 9:56 am
android_version: 8.0
Location: Eclipse

AT Scripting Language documentation

Post by Zukero »

Hello fellow AT contributors. If you follow closely the project news and/or this forum, you may now that I am currently working on writing a scripting language/engine for AT. It is slowly starting to take shape, and the scripting language formalism, while subject to change, is taking shape.

In this post, I'll try to maintain an up-to-date documentation of the language, at least until the engine gets merged into the game, and this documentation is moved to the wiki (or other appropriated support). Writing this as I write the code has two goals : keep track of current state while preventing me from having to write it all in one go; and gather comments & ideas from the community.

For those interested in the code, it currently lives at : https://github.com/Zukero/andors-trail/ ... ne_initial

Documentation

This is a first draft, and information may seem bulk. I try to write it so that it can be read straight once, but some concepts are inter-dependants, so information from one section may use concepts explained in a further section.
Do not hesitate to comment the documentation itself !

Integration in the project

Script files are located in the res/raw/ folder of the project, as plain-text .ats files. The file extension used doesn't matter, but helps for identification. ATS stands for Andor's Trail Script.

The scripts files to load are referenced in the res/values/loadresources.xml and res/values/loadresources_debug.xml, respectively in the "loadresources_scripts" and "loadresources_scripts_debug" arrays.

For a map to have active scripts, you need to define (in Tiled, or directly in the XML) a map property (in Tiled, "Map" menu -> "Map properties") named "scripts" containing semi-colon separated scripts identifiers.
Other game objects reference scripts in their JSON definition (Items and Actor Conditions only for now) using an array of objects that have a single field "name" using the script's name for value. Two arrays can be used : "scripts" and "private_scripts". The difference between these two will be covered in the next section.

Script lifecycle

Before digging in the language syntax, you need to understand how the scripts are handled in AT. Between writing a script and having its effects applied, the scripts goes through several states :
  • Loaded in library
  • Instantiated for an object
  • Activated in the engine
  • Executed
  • Deactivated from the engine
When AT starts, it reads the resources, as referenced in the res/values/loadresources.xml file. The first step is to read all the scripts files (the res/raw/*.ats files), in order to load them in the scripts Library. This Library is a simple table of pairs <script_id, script_data> values. (For experts,) at this step, the script is converted from textual form to an abstract syntax tree, so most scripting errors will be reported in the lgocat.

When the other resources are read, those that use scripts instantiate (get their own private copy of) the referenced scripts. For example, if two maps reference the script "kill_player_on_enter" ( :evil: ), each map object will retrieve its own copy the script from the library when they are read by AT resource loader.

Once an object has a copy of a script, it is still not ready to run. It must be activated in the engine. Each object type has its own reasons to activate a script. A map will activate its scripts when the player enters it. A weapon will activate its scripts when the players equips it.
Once activated, a script is loaded in the engine, and ready to be triggered, but not yet executed.
The exception to this is the private scripts (those defined in the private_scripts JSON array). The private scripts are not activated, but are executed when their owner is reponsible for triggering the event.
Typical usage is for a potion that will have an effect when consumed. This potion's effect has no meaning when the player drinks another potion does it ? I think these explanations between scripts and private scripts is not very clear. I'll try to do it better next time.

At last, when the trigger condition for an active script is met, the script is executed.

Finally, just as scripts need to be activated, they also need to be deactivated when irrelevant. They are removed from the engine, but can be reactivated later. A map will deactivate its scripts when the player leaves the map.

Scripts files syntax

Remember that the script files are plain-text .ats files, located in res/raw/
Each .ats file can contain any number of scripts, just like how the existing JSON files can contain any number of objects. I think it will help keeping the file count (relatively) low.

Syntax is the following : ("<script id>" <trigger condition> [ <script code> ] ([ <script description> ])? )*
Dummy example, for those not fan of regular expressions :

Code: Select all

"script_identifier" triggerCategory.triggerEvent [
  script code
]

"other_script_identifier" otherTriggerCategory.otherTriggerEvent [
  other script code
] [This script does something.]

...
As you can see, there is still no reference to the scripting language itself. Instead, I used some placeholder.
"Wait... does that mean that this whole thing is a hoax ? I've read this all for nothing ?"
Fear not. It is simply to early. Remember that when scripts are loaded in the library, their code has not yet been parsed by the game code ! Let's focus on this stage for now.
So, there are four elements defining a script :
  • The script identifier
  • The trigger condition
  • The script code
  • The script description (optional)
The script identifier, defined between double quotes ("), is the handle by which you will reference the script from the other content. It needs to start by a letter (lower or upper case), and can contain plain letters (a-z, A-Z), digits (0-9), underscores (_), and dashes (-). I suggest to follow the same convention as AT content IDs : lowercase words separated with underscores, optionally with numeral suffix, and occasional uppercase for proper nouns (characters, cities...).

The trigger condition defines the events that will trigger the script execution. It follows the format <triggerCategory>.<triggerEvent>. For example map.onEnter, or player.onKilled. The list of available categories and events will be listed in the "Reference" section at the end of this documentation.

The script code, between brackets ([ and ]), is the actual effect of the script. It is written using the scripting language defined in the next section.

The script description is optional, but can help to know what the script does. Moreover, in a future update, it will be presented to the player in some cases (items and actor conditions effects for example), to keep the AT way of showing the numbers to the player.

The scripting language

At last, we're getting to eat the essential substance of this documentation. This scripting language follows the typical syntax of C-types languages : Java, C++, C#...
Note to programmers (at least those familiar with AT code) : although it looks like you'll be accessing the game data directly, there is no direct mapping to Java classes. Every field, every method accessed from the scripting language are directly defined IN the language as KEYWORDS, and performs more complex logic behind the scene.

At the moment, there are four main types of constructs in the language : associations, method calls, if-else flow control, and while loops.

An association is meant to store a value in a variable. The syntax is the following :

Code: Select all

<variable reference> = <value>;
A variable reference is either a game object field (player.attackChance, attack.damage, more on these later) or a local script variable (some temporary value holder that will only live as long as the script execution, more on this later too). Anyway, these can only reference "primitive" types : numbers, booleans, strings. (Experts only) don't try to change Object references with this.
A value can be obtained by many ways, including referencing game object fields, local script variables, method calls, constants, or performing arithmetic or boolean operations on a combination of those.
There is no type checking (not yet ?) for associations, so nothing will warn you that you are trying to put a numeral value in a boolean until you run the script in-game and it spits an error in your LogCat console.

A method call is meant to perform complex actions on a game object, depending on some parameters. You can substitute the world "function" for "method" if it makes more sense to you. The syntax is the following :

Code: Select all

<game object reference>.<method name>(<parameters>);
A game object reference is very similar to the variable reference explained before, except this one doesn't point to a primitive value, but a complex game object, such as "player" or "map". The available methods depend on the type of game object accessed, and the available game objects depend on the script trigger condition. For example, the "attack.onHit" scripts will give access to a game object called "attack", but the "map.onEnter" ones will not. Which method is available for which object type, and which object is available for which trigger condition will be documented in the "Reference" section at the end of this documentation.
The method name is the name of the method. :o The number and the types of parameters to use for each method will be documented in the "Reference" section.
The parameters are a coma (,) separated list of values.

An if-else flow control construct is used to make decisions from within your script. It has the following syntax :

Code: Select all

if (<boolean value>) { <some code> } (else { <some other code> })?
If you never coded, it works the following way : if the boolean value is true, some code is executed, otherwise and optionally some other code is executed.
Note that the whole "else {}" construct is optional. Also note that you can chain condition using the if () {} else if () {} else {} syntax.
If you were wondering, the boolean value is simply a value of boolean type...

A while loop construct is used to perform the same block of script several times. It has the following syntax :

Code: Select all

 while (<boolean value> ) { <some code> } 
If you never coded, it works the following way : if the boolean value is true, some code is executed, then the boolean value is re-evaluated, and if still true, some code is executed again... until boolean value turns out to be false. If boolean value never turns false, your script is locked in an "infinite loop", a common error in software programming, and the game will freeze.

A local script variable can be of three types : numeral, boolean or string. You first need to create it using an association, with the following syntax :

Code: Select all

<type> <variable name> = <value>;
Type can be num for numerals, bool for booleans, or string for strings. The variable name is any string starting with a letter (a-z,A-Z), and containing only letters, digits, underscores, and dashes. Make sure that the value associated matches the declared type.
Note : in case you were wondering, all numerals are treated as "double" in the engine, and converted appropriately when pulled from / pushed to game object fields or methods.

The operations are boolean or arithmetic calculations performed on pairs of values. They use the following syntax :

Code: Select all

<value 1> <operator> <value 2>
Parenthesis can (and really should) be used if more than one operator is used in a single value. The engine does not (yet ?) implement operator precedence, and expressions are evaluated right to left : for example 4/2+3 is equivalent to 4/(2+3) => 0.8 and not (4/2)+3 => 5. I know it sounds weird, but it makes the engine simpler and more efficient to compute operations right to left...
Once again, no type check, so make sure that both value 1 and value 2 are of the same type, and can be used with the chosen operator. It doesn't make sense to do true / 5, or false >= "toto"
The available operators will be defined in the now close "Reference" section.

The constants are plain values, either numerals, booleans, or strings.
The numerals can be negative (trailing -), and have decimals (with . as decimal separator). Examples :

Code: Select all

42; 3.14156; -12.2; 0.75
Decimal numbers between -1 and 1 must have their leading zero. 0.12 is legit, .38 isn't.
Booleans are simple, it's either true or false. Period.
Strings, just like in Java, are defined by putting mostly anything between double quotes ("). Just avoid double quotes and backslashes (\), oh, and you weird native language's characters (kanjis, accented cahracters, cyrillic...). I don't know how the parser would react to non-ASCII codes. For now, they're only meant to reference content id, so we should be free enough with these two limitations.

I guess that's it for the language syntax. We can now move on to...
"Wa.wai.wait ! There's no word about arrays, list, maps, or any kind of collection !"
So far, I do not see the need for these. And they will be a pain to include. If there is a good reason to include them, I will work on it.


"Ok, but, you've flooded us with regular expressions, and weird words like flow control, operator precedence... and NOT A SINGLE CODE EXAMPLE !"
Yeah, maybe I should open the syntax section with a bunch of examples... later boys and girls, later... for now, I only planned an "Example" section after the "Reference" one.

Reference

This section is meant to compile all the language keywords, all the trigger conditions, everything !

Trigger conditions.

map.onEnter
Once activated, triggers when you enter a map, any map. For now, I can't think of any good reason to associate this type of scripts with anything else than a map, but it would still work.

map.onLeave
Once activated, triggers when you leave a map. Same use cases as map.onEnter

player.statsUpdated
Either activated, either in worn items and actor condtions private scripts, it triggers anytime the player stats changes. This is the trigger to use when your script wants to impact the player stats (AC, BC, AD, HP...).

item.onUse
Either activated, either in an item's private scripts, it triggers anytime the player uses an item from the inventory or the quickslots. This is the trigger to use when your scritp wants to impact an item's effects, or all items usage. Your scripts can then use if (item.category == "categoryName") or if (item.id == "itemId") to apply only on certain items.

item.onEquip
Either activated, either in an item's private scripts, it triggers anytime the player equips an item from the inventory. When attached to an item's private scripts, you can add strange effects related to having this item equiped (actor condtions, stats bonuses...). If in the public scripts of any object, your scripts can use if (item.category == "categoryName") or if (item.id == "itemId") to apply only on certain items.

item.onUnequip
Either activated, either in an item's private scripts, it triggers anytime the player unequips an item from the inventory. When attached to an item's private scripts, you can remove the strange effects related to having this item equiped (actor condtions, stats bonuses...). If in the public scripts of any object, your scripts can use if (item.category == "categoryName") or if (item.id == "itemId") to apply only on certain items.

Available objects

world
The whole world.
Available for triggers : all of them.
Available methods :
  • getMap(String map_id) : returns the map with id "map_id". You can then call all fields and methods of the map object.
map
The current map, the one that is displayed.
Available for triggers : map.onEnter, map.onLeave
Available fields :
  • outside : boolean, true if the map is marked as outside ("outside" property in Tiled).
Available methods :
  • activateGroup(String group_id) : activates the map objects belonging to group group_id
    deactivateGroup(String group_id) : deactivates the map objects belonging to group group_id
player
Andor's brother himself !
Available for triggers : all of them.
Available fields :
  • All those of actor. A player is a special actor, so if writing actor.ac is legit, writing player.ac is too. In terms of Object-Oriented Programming, this is called inheritance : actor is a superclass of player.
    base.maxHP : numeral, the player's base maximum health points (when no items of skills are involved).
    base.maxAP : numeral, the player's base maximum action points (when no items of skills are involved). Always 10 ATM.
    base.ad.min : numeral, the player's base minimum damage (when no items of skills are involved).
    base.ad.max : numeral, the player's base maximum damage (when no items of skills are involved).
    base.ac : numeral, the player's base attack chance (when no items of skills are involved).
    base.bc : numeral, the player's base block chance (when no items of skills are involved).
    base.equipCost : numeral, the player's base AP cost for equiping items (when no items of skills are involved).
    base.moveCost : numeral, the player's base AP cost for moving when in combat, for fleeing for example (when no items of skills are involved).
    base.useCost : numeral, the player's base AP cost for using items in combat (when no items of skills are involved).
Available methods :
  • all those of actor
    getItemCount(String item_id) : returns the number of item item_id in the player's inventory as a numeral.
    giveItem(String item_id, num count) : adds count number of item item_id in the player's inventory.
    removeItem(String item_id, num count) : removes count number of item item_id in the player's inventory.
    getItemInSlot(String slot_name) : returns a reference to the item equipped by the player in the slot slot_name. The value returned has the same fields and methods available as the item variable. slot_name must be one of the following : weapon, shield, head, body, hand, feet, neck, leftring, rightring.
    equipItemInSlot(String item_id, String slot_name) : equips the item item_id in the slot slot_name. Just make sure that you're not trying to equip a ring on the player's neck ! slot_name must be one of the following : weapon, shield, head, body, hand, feet, neck, leftring, rightring.
    unequipSlot(String slot_name) : Removes the item equiped in the slot slot_name. The item is sent back to the inventory. slot_name must be one of the following : weapon, shield, head, body, hand, feet, neck, leftring, rightring.
    hasQuestProgress(String quest_id, num quest_stage) : boolean, returns true if the player has reached stage quest_stage in quest quest_id.
    addQuestProgress(String quest_id, num quest_stage) : makes the player reach stage quest_stage in quest quest_id.
    addExperience(num exp_count) : rewards the player with exp_count experience points.
    getAlignment(String faction_id) : numeral, returns the number of alignment points of the player with faction faction_id.
    addAlignment(String faction_id, num count) : adds count alignment points for faction faction_id to the player.
actor
The player, or a NPC, depending on the context.
Available for triggers : none so far.
Available fields :
  • ac : numeral, the actor's attack chance, not the base one, the one after item & skills effect are applied. Changing this value for the player is discouraged (except in player.statsUpdated scripts), as it will be recomputed on level ups, item changes...
    bc : numeral, the actor's block chance, not the base one, the one after item & skills effect are applied. Changing this value for the player is discouraged (except in player.statsUpdated scripts), as it will be recomputed on level ups, item changes...
    hp.cur : numeral, the actor's current health points.
    hp.max : numeral, the actor's maximum health points.
    ap.cur : numeral, the actor's current action points.
    ap.max : numeral, the actor's maximum action points.
    ad.min : numeral, the actor's current action points. Changing this value for the player is discouraged (except in player.statsUpdated scripts), as it will be recomputed on level ups, item changes...
    ad.max : numeral, the actor's maximum action points. Changing this value for the player is discouraged (except in player.statsUpdated scripts), as it will be recomputed on level ups, item changes...
Available methods :
  • addActorCondition(String condition_id, num multiplier, num duration_in_rounds, num chance_to_apply_between_0_and_100) : nothing returned, pretty self descriptive.
    clearActorCondition(String condition_id) : nothing returned, quite self descriptive too.
item
The item used
Available for triggers : item.onUse, player.statsUpdated if script is in an equiped item's private scripts.
Available fields :
  • reward.hp.max : numeral, the maximum HP the item will give to the player.
    reward.hp.min : numeral, the minimum HP the item will give to the player. Is equals to reward.hp.max for fixed HP rewards.
    reward.ap.max : numeral, the maximum AP the item will give to the player. (Cleave-type of effect)
    reward.ap.min : numeral, the minimum AP the item will give to the player.
Operators

Numerals comparison :
  • x <= y : returns true if x is lesser than or equals to y
    x < y : returns true if x is strictly lesser than y
    x >= y : returns true if x is greater than or equals to y
    x > y : returns true if x is strictly greater than y
    x == y : returns true if x is equals to y
Boolean operations
  • !x : negation. Returns true if x is false, false if x is true
    x && y : AND. Returns true if both x and y are true
    x || y : OR. Returns true if at least one of x and y is true
Numeral operations
  • x + y : returns the sum of x & y.
    x - y : returns the substraction of y to x.
    x * y : returns the product of x and y.
    x / y : returns the quotient of x by y.
Strings operations
  • x % y : returns the concatenation of x and y. Works with numbers, boolean, and strings. Example : ("foo" % "bar" % 2000) returns "foobar2000". For Java coders, it is implemented using Object.toString() + Object.toString().
    x == y : returns true if x is equals to y. For Java coders, it is implemented using Object.equals(Object other), so it should work with any, not only Strings and numbers.
Examples

Not much, I just quickly pasted the scripts I currently have used for testing, but they actually cover almost everything the engine can currently do. (Spoiler : they're also in my GitHub repo). As an exercise, try to find out what they're doing on your own !

Code: Select all

"map_boostAC" map.onEnter [
	if (map.outside) {
		player.ac = player.ac * 2;
	} else {
		player.bc = player.bc * 2;
	}
	player.addActorCondition("chaotic_grip",5, 2, 50);
]

"map_unboostAC" map.onLeave [
	if (map.outside) {
		player.ac = player.ac / 2;
	} else {
		player.bc = player.bc / 2;
	}
	player.clearActorCondition("chaotic_grip");
]

"player_boostAC" player.statsUpdated [
	player.ac = player.ac * 1.5;
][Boosts your AC by 50% of current value.]

"useless_one" map.onEnter [
	num a = 5;
	if (a < 3) {
		bool b = true;
		num c = 2;
	} else if (a == 5 ) {
		string d = "TestString";
	} else {
		num b = 12.3;
		bool c = true;
		while (c) {
			a = a - 1;
			if (a == 0) {
				c = false;
			}
		}
	}
][Simple test of local variables scoping]

Last edited on 2014-01-03 13:48 UTC to match github commit 4a4cf36c02
Last edited by Zukero on Fri Jan 03, 2014 1:49 pm, edited 5 times in total.
Lvl: 78, XP: 8622632, Gold: 271542, RoLS: 1, ElyR: -, RoL: -, ChaR: 1, GoLF: 1, ShaF: 1, SRoV: 1, VSH: 1, WMC: 1, GoW: 1
HP: 71, AC: 301%, AD: 38-47, AP: 3, ECC: 50%, CM: 3.75, BC: 101%, DR: 2
User avatar
Zukero
Lead Developer
Posts: 2028
Joined: Thu Jul 21, 2011 9:56 am
android_version: 8.0
Location: Eclipse

Re: AT Scripting Language documentation

Post by Zukero »

Maybe this should be moved to the "developers" section... there's no spoilers or anything secret in here.
Lvl: 78, XP: 8622632, Gold: 271542, RoLS: 1, ElyR: -, RoL: -, ChaR: 1, GoLF: 1, ShaF: 1, SRoV: 1, VSH: 1, WMC: 1, GoW: 1
HP: 71, AC: 301%, AD: 38-47, AP: 3, ECC: 50%, CM: 3.75, BC: 101%, DR: 2
User avatar
nyktos
VIP
Posts: 3463
Joined: Wed Sep 14, 2011 5:38 pm
android_version: 7.1 - Nougat
Location: Nor City, Dhayavar

Re: AT Scripting Language documentation

Post by nyktos »

beautiful work Zukero

since there are no spoilers, like you said...
maybe we leave this out in public view to encourage possible contributors to make the first step?


=== edit ===

thread moved
Last edited by nyktos on Mon Nov 18, 2013 6:39 pm, edited 1 time in total.
Reason: double post combined
"Embrace the Shadow"

Image

[Lv: 60] [HP: 175] [AC: 361] [AD: 25-39] [BC: 75]
[Dual Wielding Swords] [Unarmored Fighting]
User avatar
Zukero
Lead Developer
Posts: 2028
Joined: Thu Jul 21, 2011 9:56 am
android_version: 8.0
Location: Eclipse

Re: AT Scripting Language documentation

Post by Zukero »

Pushed two new commits yesterday and today...
I'll update this documentation very soon to match these.

It's VERY far from complete, but it begin to have actual use !
My debug data no give you an actor condition when you enter a given map, and that actor condition doubles the effects of any healing potion you use !

--Off-topic--
I guess I've spent roughly 8 hours coding/debugging in two days, plus my paid job... I'm so tired.
But I have to get up early tomorrow : I'm expecting to receive my new bass ! So excited !
Lvl: 78, XP: 8622632, Gold: 271542, RoLS: 1, ElyR: -, RoL: -, ChaR: 1, GoLF: 1, ShaF: 1, SRoV: 1, VSH: 1, WMC: 1, GoW: 1
HP: 71, AC: 301%, AD: 38-47, AP: 3, ECC: 50%, CM: 3.75, BC: 101%, DR: 2
User avatar
cccd3cpt
Posts: 114
Joined: Wed Nov 14, 2012 5:30 am
android_version: 4.2

Re: AT Scripting Language documentation

Post by cccd3cpt »

Good work as always Zukero! :)
Zukero wrote: I guess I've spent roughly 8 hours coding/debugging in two days, plus my paid job... I'm so tired.
#commitment right here ladies and gentlemen.
User avatar
fiernaq
Posts: 695
Joined: Fri Mar 16, 2012 3:49 pm
android_version: 2.3 - Gingerbread

Re: AT Scripting Language documentation

Post by fiernaq »

WTB a "like" button :P
Level: 58, HP: 102, AC: 295%, AD: 46-56, AP: 2/12, BC: 35%, DR: 4
Gold: 75235 | RoLS: 0 RoL: 0 SRoV: 0 VSH: 0
Skills: IF1, Ev1, Ev2, Ev3, CE1, CS1, CS2, Re1, WA1, HH1, Cl1, HH2, DaggerPro1, LightArmorPro1, ShieldPro1, WA2, Cl2
Equipment: Enhanced Combat Helmet, Serpent's Hauberk, Marrowtaint, Quickstrike Dagger, Remgard Shield, Villain's Ring, Villain's Ring, Leather Gloves Of Attack, Enhanced Combat Boots
Last Updated: 02-Dec-2013
User avatar
Oet
Posts: 219
Joined: Fri Nov 01, 2013 5:03 pm
android_version: 4.1 - Jellybean
Location: Sweden

Re: AT Scripting Language documentation

Post by Oet »

Wall of text crits you for 678!

An interesting and well written wall tough :) Good job Zukero, keep it up and don't forget to take a break now and then :lol:
Oet:
Lvl:80|XP:9214538|AP:3|HP:291|AC:351%|AD:51-68|CHS:20|CM:0|BC:135%|DR:1
WA:1|HH:1|Do:1|CS:2|CL:1|QL:3|CE:1|IF:6|Reg:1|WP:1S:1|AP:L:1|FS:DW:2|S:DW:1
RoLS:2|ELYR:1

Last updated 22/01-14
User avatar
Zukero
Lead Developer
Posts: 2028
Joined: Thu Jul 21, 2011 9:56 am
android_version: 8.0
Location: Eclipse

Re: AT Scripting Language documentation

Post by Zukero »

Thanks guys for the support ! It's the awesomeness of this community that fuels my code-fu !

Oet : actually, coding on AT is kind of what my breaks are made of these days :D I'll complete this before the nervous breakdown ! I HAVE TO !
Lvl: 78, XP: 8622632, Gold: 271542, RoLS: 1, ElyR: -, RoL: -, ChaR: 1, GoLF: 1, ShaF: 1, SRoV: 1, VSH: 1, WMC: 1, GoW: 1
HP: 71, AC: 301%, AD: 38-47, AP: 3, ECC: 50%, CM: 3.75, BC: 101%, DR: 2
User avatar
PK17
Posts: 839
Joined: Fri Jul 20, 2012 7:33 pm
android_version: 4.0

Re: AT Scripting Language documentation

Post by PK17 »

If your doing something that makes you happy it never feels like work.

Also Zuk, as I was reading through this for the third or fourth time, I notice you said you couldn't think of any reasons to use the map.onENTER trigger for anything besides the map.

I always thought it would be cool if say you entered feygard territory and all (or some) feygard items recieved a boost, same for the blackwater items if you are in/near blackwater, and all (some) other faction related locations. Also, let's say in map 'elytharashrine5' there is a shrine that when upon entering the map it automaticly removes any kazual or shadow items equiped then forbids you from equipping them.
Take a stop by my game thread for some forum fun!!!

http://andorstrail.com/viewtopic.php?f=9&t=4577
User avatar
cccd3cpt
Posts: 114
Joined: Wed Nov 14, 2012 5:30 am
android_version: 4.2

Re: AT Scripting Language documentation

Post by cccd3cpt »

PK17 wrote:If your doing something that makes you happy it never feels like work.

Also Zuk, as I was reading through this for the third or fourth time, I notice you said you couldn't think of any reasons to use the map.onENTER trigger for anything besides the map.

I always thought it would be cool if say you entered feygard territory and all (or some) feygard items recieved a boost, same for the blackwater items if you are in/near blackwater, and all (some) other faction related locations. Also, let's say in map 'elytharashrine5' there is a shrine that when upon entering the map it automaticly removes any kazual or shadow items equiped then forbids you from equipping them.
Very interesting ideas PK. +1
Post Reply