I've found that using of condtional statement
is very useful in many areas. They are already used to restrict running the
strategic AI to servers and setting up the flag bases correctly for CTF games. I
have found a few other uses for them.
Here is an example of altering the strategic AI of a map that already has SP support without breaking online gaming. If you alter the AI on a map that is in circulation, it well CTD when you try to connect to a game server. The way around this is to ask the game engine what type of game is being played and run the appropriate scripts. This is how it's done:
Unpack the map and goto the maps root folder (Bf1942\Levels\<map name>).
Make a directory called aisp in the root folder. The path should look like this:
And copy all 4 of the files in the ai directory into it. Here are the names of the files you copy from the ai folder:
Then open the AI.con file and replace these lines:
game.gameMode -> v_gamemode
if v_gamemode == GMSingle
Once this is done, you can enhance, mangle and edit the files in the aisp folder all you want and still connect to COOP game servers with the map. Any changes you make to the scripts in the aisp folder are restricted to SP. COOP games will run the original strategic AI code.
Here are some things to note about variables, constants and conditions.
1) You must declare a variable or constant before you can use it.
2) All vaiables start with: v_
3) All constants start with: c_
4) Only variables, constants, numbers and strings can be used in conditional statements. This does not work:
if game.gameMode == GMSingle
5) Variables and contants can be initialized when they are declared:
Var v_isfive = 5
Const c_mynick = "Four Cents Shy"
6) Variables and constants can be substituted for command paraameters, but not the commands themselves. This works:
Var v_aggr = 0.9
But this does not
Var v_com = TimeLimit
aiStrategy.v_com = 120
7) Only 2 forms of the if statement are allowed:
Var v_yes = 1
Var v_value = 5
if v_value == 5
8) Only the == works with the if statment. Thankfully there is a set of utilities for more complex conditions:
I use the Utils.expr the most. It will evaluate an expression and return a 1 or 0 when the expression is true or false. Here is an example of how to use it. I have a script that I add to maps to fix bad vehicle code. The Pak40 is not in all maps so I test for it before applying the fix:
objectTemplate.info Pak40 -> v_info
Utils.expr v_info != "No object template" -> v_exists
... fix the code
The Utils.expr command will accept all these as the second parameter:
== != > < >= <= &|
Conditional statements have much great potintial and are not well used. For instance, it's possible to create one map that works for many different mods by using this to run the correct scripts:
game.customeGameName -> v_gamename
if v_gamename == "BF1942"
... run code for bf
elseIf v_gamename == "XPACK1"
... run code for RrR
elseIf v_gamename == "XPACK2"
... run code for SW
elseIf v_gamename == "DesertCombat"
... run code for DC
I'm still exploring thru the commands. I've found many that provide very useful information. Out of the almost 2000 commands available to the game engine, a little over 500 are actually used in creating maps and mods. I've compiled a List Of BF Commands using the debugger for those who would like to take a look at them. Almost 3/4 of these commands are used to develop and debug maps. You can use the debugger to find out more about them.
Yep, this is really good code. I used some of
this to fully integrate FHX into Forgotten Hope. Problem was there is code in
Forgotten Hope that breaks bot support, but I couldn't just remove it since it
was needed for conquest mode. So instead I did the following:
Unfortunately this doesn't work for skirmish mode as Muzzi discovered, so we changed it as follows:
Firstly a file called is_coop.con was created in the game.rfa, it contains the following code:
Now, when you want to run code for coop or skirmish mode only, you do the following:
Note that you may need to provide a full relative reference to the is_coop.con file for the run statement, or enclose the run statement with console.useRelativePath statements as follows:
As FourCentsShy pointed out, there are a ton of functions in Battlefield you could use with if statements, but you should be careful because not all data is shared across the network between client and server.
For instance I tried to create a level that would change spawns, out of bounds and statics depending on the max players setting in the server. So I used game.maxNrOfPlayers and ran different level files depending on the number of players. Unfortunately if a client has a different value in their configs, then the game will use that when connecting to the server and you'll either get a data differs from server error, or the map will be very screwed up for the client.
Same deal for trying to create a customized config file for a mod. You can't just create variables and expect them to be sent over the network to the clients, it doesn't work.
Still, lots of possibilities.
great stuff, 4Cshy, thank you so much!!
but unlike you said, the if statement supports the following operators for integer comparition:
next thing, i changed your code a little bit, hdm
oh, and i forgot to thank you too!
It's good to see people contributing to this.
Thanks C.ZI for correcting me. I learned something new. I could have sworn that
I tried every combination. LOL! I guess not.
Edit: I was just wondering. Has anybody tried using the while ... endWhile statement for anything useful? I tried it once just for fun. I used it to augment the damage system ingame with the console.bindKeyToConsoleScript command. It was fun going after a tank with my knife and winning.
QUOTE (C.ZI @ Sep 16 2004, 11:54 AM)
I'm not 100% sure that will work. I know it looks cleaner but I set it up the other way because I was having problems with invalid statements if one of the game variables wasn't set (such as when playing skirmish, gamePlayMode was not set). So my concern is that if one of the statements is invalid, then the v_is_coop variable will not be properly set. Still if it works, then go for it.