MaHuJa/Sandbox – User

From Bohemia Interactive Community
Jump to navigation Jump to search
No edit summary
Line 7: Line 7:
The most basic form of scripting is the oneline scripts in various init fields, trigger on (de-)activation fields, and waypoint activation fields in the editor itself.
The most basic form of scripting is the oneline scripts in various init fields, trigger on (de-)activation fields, and waypoint activation fields in the editor itself.


==Example: Destroying a tank==
===Example: Destroying a tank===
A mission requires the player, and his two helpers, to get a tank parked a little behind the engagement area, and reinforce the front with it.  However, as they approach the tank, it blows up. Now they have to find and punish the saboteurs. And perhaps go back to the front to help out in any way they can.
A mission requires the player, and his two helpers, to get a tank parked a little behind the engagement area, and reinforce the front with it.  However, as they approach the tank, it blows up. Now they have to find and punish the saboteurs. And perhaps go back to the front to help out in any way they can.


Line 25: Line 25:
*Victory condition triggers
*Victory condition triggers


==Customized ammobox==
===Customized ammobox===


Create an ammobox. (Give it the name ammo_one) In its init line, fill in
Create an ammobox. (Optionally give it the name ammo_one) In its init line, fill in
  clearweaponcargo this; clearmagazinecargo this; this addweaponcargo ["m16a2",2]; this addmagazinecargo ["30Rnd_556x45_Stanag",30]
  clearweaponcargo this; clearmagazinecargo this; this addweaponcargo ["m16a2",2]; this addmagazinecargo ["30Rnd_556x45_Stanag",30]
You've just created an ammobox that will contain two m16 rifles and 30 magazines for them. For the "scripting names" of weapons and ammunition, see [[ArmA:_Weapons|here]]. For unofficial addons, the names are usually listed in a readme.
You've just created an ammobox that will contain two m16 rifles and 30 magazines for them. For the "scripting names" of weapons and ammunition, see [[ArmA:_Weapons|here]]. For unofficial addons, the names are usually listed in a readme.


Whenever you are editing an object, like an ammobox, "this" has the special meaning of "this particular object". If you write the same thing for an "ammo_two" the lines there will not change the content of ammo_one. This allows copy/paste to be used to write it once and paste it everywhere, and it will affect the object it has been copied to. Had you written  
Whenever you are editing an object, like an ammobox, [[this]] has the special meaning of "this particular object". If you write the same thing for an "ammo_two" the lines there will not change the content of ammo_one. This allows copy/paste to be used to write it once and paste it everywhere, and it will affect the object it has been copied to. Had you written  
  clearweaponcargo ammo_one
  clearweaponcargo ammo_one
instead, you'd always be clearing the contents of that first crate.
instead, you'd always be clearing the contents of that first crate unless you changed it every time.




Line 39: Line 39:


<div style="float:right;border-left-style:double;border-bottom-style:double;border-top-style:thin;border-right-style:thin">There are two formats for script files, [[SQS]] and [[SQF]].<br/>
<div style="float:right;border-left-style:double;border-bottom-style:double;border-top-style:thin;border-right-style:thin">There are two formats for script files, [[SQS]] and [[SQF]].<br/>
Use [[SQF]]: SQS are deprecated and will stop functioning at some point in time. Besides, [[SQF]] lends itself to readability and style.</div>
Use [[SQF]]: SQS are deprecated and will stop functioning at some point in time.<br/>
Besides, [[SQF]] lends itself to readability and style.</div>


Obviously, these oneliners are of limited use when you want big things to happen. That's when script files come into play. These files are put alongside the mission.sqm which the editor makes, and get packed into the final pbo that you would give to others. In this section, I'll introduce how to create a system to 'buy weapons'.
Obviously, these oneliners are of limited use when you want big things to happen. That's when script files come into play. These files are put alongside the mission.sqm which the editor makes, and get packed into the final pbo that you would give to others. In this section, I'll introduce how to create a system to 'buy weapons'.
Line 50: Line 51:


In that directory, you will find a file called mission.sqm - this is the file produced by the mission editor, and contains the type, placement, name, init script, and so on for every object you've placed, every trigger, marker, and so on. Optionally you could create files like [[briefing.html]] and [[description.ext]] but that's beyond the scope of this tutorial.  
In that directory, you will find a file called mission.sqm - this is the file produced by the mission editor, and contains the type, placement, name, init script, and so on for every object you've placed, every trigger, marker, and so on. Optionally you could create files like [[briefing.html]] and [[description.ext]] but that's beyond the scope of this tutorial.  
===The money and income===


Create an empty file called init.sqf (''Init.sqf'' is a special name, and will be run by the game as the mission starts) and open it - notepad will do fine. (MS Word will probably not.) Here's what to put into it:
Create an empty file called init.sqf (''Init.sqf'' is a special name, and will be run by the game as the mission starts) and open it - notepad will do fine. (MS Word will probably not.) Here's what to put into it:
Line 67: Line 70:
   hint format ["You now have %1 dollars.",money];
   hint format ["You now have %1 dollars.",money];
  }
  }
It uses [[while]] (which requires [[do]]), [[sleep]] [[hint]] and [[format]] functions.


Alternative 2: Travel is money
Alternative 2: Travel is money
Line 76: Line 80:
   hint format ["You now have %1 dollars.",money];
   hint format ["You now have %1 dollars.",money];
  }
  }
The latter will force the player to move about, even though he is unarmed and there are enemies about.
The latter will force the player to move about, even though he is unarmed and there are enemies about. This also uses the [[position]] and [[distance]] functions, as well as the [[player]] constant. If you want to understand it, it might be time for [[Data Types]] too.
 
Try to run it. It if works, you should see the money counter in the upper right updating every minute. If it shows an error, you probably made an error in copying it (or I messed up). If you typed it, common pitfalls are:
*while uses {} - if uses ()
*you missed a ; at the end of a command
 
===Buying===
 
I wish i knew how to make those pretty dialogs and all, but I don't. And they're anything but simple so they're not good for a tutorial like this. So I'm going to use actions - those menu items in the lower right of the screen.





Revision as of 16:56, 1 March 2007

This article assumes you are somewhat familiar with mission editing - without scripting.

Getting started with ArmAscript

Oneliners in the editor

The most basic form of scripting is the oneline scripts in various init fields, trigger on (de-)activation fields, and waypoint activation fields in the editor itself.

Example: Destroying a tank

A mission requires the player, and his two helpers, to get a tank parked a little behind the engagement area, and reinforce the front with it. However, as they approach the tank, it blows up. Now they have to find and punish the saboteurs. And perhaps go back to the front to help out in any way they can.

These steps can achieve that:

  • Create the player squad
  • Create the tank, name it "theTank"
  • Create a couple saboteurs hiding in some bushes a couple hundred meters nearby - preferrably not with line of sight to the tank so that they could start shooting the player early.
  • Create a trigger near to the tank (almost on top of) with both sizes set to 150. Set it to "west" "present". In the "on activation" field, type in the following:
theTank setdamage 1

Congratulations, you've just written your first script.

The demonstration mission itself needs a few things more, but which aren't important for this tutorial.

  • Briefing, all of that
  • Waypoints for the player group
  • Notification of changed goals
  • Victory condition triggers

Customized ammobox

Create an ammobox. (Optionally give it the name ammo_one) In its init line, fill in

clearweaponcargo this; clearmagazinecargo this; this addweaponcargo ["m16a2",2]; this addmagazinecargo ["30Rnd_556x45_Stanag",30]

You've just created an ammobox that will contain two m16 rifles and 30 magazines for them. For the "scripting names" of weapons and ammunition, see here. For unofficial addons, the names are usually listed in a readme.

Whenever you are editing an object, like an ammobox, this has the special meaning of "this particular object". If you write the same thing for an "ammo_two" the lines there will not change the content of ammo_one. This allows copy/paste to be used to write it once and paste it everywhere, and it will affect the object it has been copied to. Had you written

clearweaponcargo ammo_one

instead, you'd always be clearing the contents of that first crate unless you changed it every time.


Script files

There are two formats for script files, SQS and SQF.

Use SQF: SQS are deprecated and will stop functioning at some point in time.

Besides, SQF lends itself to readability and style.

Obviously, these oneliners are of limited use when you want big things to happen. That's when script files come into play. These files are put alongside the mission.sqm which the editor makes, and get packed into the final pbo that you would give to others. In this section, I'll introduce how to create a system to 'buy weapons'.

I leave the enemies and all those little details to you.

In order to have a place to save these files, you first need to save your mission with a name. Your next job is to find that mission. It's under My Documents/ArmA/Missions/missionname.islandname (e.g. My Documents/ArmA/Missions/ScriptTutorial.Sara) or My Documents/Arma Other Profiles/Playername/Missions/missionname.islandname (e.g. My Documents/ArmA Other Profiles/MaHuJa/Missions/ScriptTutorial.Sara)

In that directory, you will find a file called mission.sqm - this is the file produced by the mission editor, and contains the type, placement, name, init script, and so on for every object you've placed, every trigger, marker, and so on. Optionally you could create files like briefing.html and description.ext but that's beyond the scope of this tutorial.

The money and income

Create an empty file called init.sqf (Init.sqf is a special name, and will be run by the game as the mission starts) and open it - notepad will do fine. (MS Word will probably not.) Here's what to put into it:

money = 0;

We need to set the money value. Like if we don't set up a bank account before we put money into it, bad things happen.

execvm "earnmoney.sqf";

This will start a script called earnmoney.sqf - which we will create later. Execvm is more or less a synonym for spawn compile loadfile - and the script is runs may continue to run in the background.

removeallweapons player;

This thing will make no sense if the player starts with good enough weapons, will it? (That command also removes magazines.)

Now, create a new blank file called earnmoney.sqf and choose one of the following:

Alternative 1: Time is money

while {true} do {
  sleep 60;
  money = money + 50;
  hint format ["You now have %1 dollars.",money];
}

It uses while (which requires do), sleep hint and format functions.

Alternative 2: Travel is money

while {true} do {
  _pos = position player;
  sleep 60;
  _lump = player distance _pos;
  money = money + _lump/2;
  hint format ["You now have %1 dollars.",money];
}

The latter will force the player to move about, even though he is unarmed and there are enemies about. This also uses the position and distance functions, as well as the player constant. If you want to understand it, it might be time for Data Types too.

Try to run it. It if works, you should see the money counter in the upper right updating every minute. If it shows an error, you probably made an error in copying it (or I messed up). If you typed it, common pitfalls are:

  • while uses {} - if uses ()
  • you missed a ; at the end of a command

Buying

I wish i knew how to make those pretty dialogs and all, but I don't. And they're anything but simple so they're not good for a tutorial like this. So I'm going to use actions - those menu items in the lower right of the screen.


Dump for later use

weapons = ["m16a2","m4","m4aim","m24"];
weaponscost = [100, 200, 250, 500];
stanag = "30Rnd_556x45_Stanag";
ammo = [stanag,stanag,stanag,"5Rnd_762x51_m24"];
[] execvm "moneytime.sqf"

Going over that line by line:

  • money = 0; sets a variable called money to 0. Otherwise it would be nil, which has a meaning along the lines of "not a number".
  • weapons = ["m16a2","m4","m4aim","m24"]; creates an array


I'm going to introduce you to a good habit: Gather all magic values in one place.