Jump to content
Sign in to follow this  
Faulk_Wulf

Trouble with Switch statement in SQF.

Recommended Posts

Right, so why doesn't this work?

No errors, returns only a pilot as recruitable when playing as West (haven't even checked East and Guer yet). I presume it's returning Pilot 3, the last Pilot in the array entry. Why? Why isn't it filling my array?

_RECRUIT_LIST set [];
_RECRUIT_LIST = switch (side player) 

do {
case west: {
                               "US_Soldier_AA_EP1",
	"US_Soldier_AAT_EP1",
	"US_Soldier_AHAT_EP1",
	"US_Soldier_AAR_EP1",
	"US_Soldier_AMG_EP1",
	"US_Soldier_AT_EP1",
	"US_Soldier_HAT_EP1",
	"US_Soldier_AR_EP1",
	"US_Soldier_Engineer_EP1",
	"US_Soldier_GL_EP1",
	"US_Soldier_MG_EP1",
	"US_Soldier_Marksman_EP1",
	"US_Soldier_Medic_EP1",
	"US_Soldier_EP1",
	"US_Soldier_LAT_EP1",
	"US_Soldier_B_EP1",
	"US_Soldier_SL_EP1",
               // MERCS
	"Mercenary_Default0",
	"Mercenary_Default1",
	"Mercenary_Default2",
	"Mercenary_Default3",
	"Mercenary_Default4",
	"Mercenary_Default5",
	"Mercenary_Default6",
	"Mercenary_Default7",
	"Mercenary_Default8",
	"Mercenary_Default9",
	"Mercenary_Default10",
	"Mercenary_Default11",
	"Mercenary_Default12",
	"Mercenary_Default13",
	"Mercenary_Default14",
	"Mercenary_Default15",
	"Mercenary_Default16",
	"Mercenary_Default17",
	"Mercenary_Default18",
	"Mercenary_Default19",
	"Mercenary_Default20",
	"Mercenary_Default20b",
	"Mercenary_Default21",
	"Mercenary_Default22",
	"Mercenary_Default23",
	"Mercenary_Default24",
	"Mercenary_Default25",
	"Mercenary_Default26",
	"Mercenary_Default27",
	"Mercenary_Default28",
               // WOODLAND MERCS
	"WDL_Mercenary_Default0",
	"WDL_Mercenary_Default1",
	"WDL_Mercenary_Default2",
	"WDL_Mercenary_Default3",
	"WDL_Mercenary_Default4",
	"WDL_Mercenary_Default5",
	"WDL_Mercenary_Default6",
	"WDL_Mercenary_Default7",
	"WDL_Mercenary_Default8",
	"WDL_Mercenary_Default9",
	"WDL_Mercenary_Default10",
	"WDL_Mercenary_Default11",
	"WDL_Mercenary_Default12",
	"WDL_Mercenary_Default13",
	"WDL_Mercenary_Default14",
	"WDL_Mercenary_Default15",
	"WDL_Mercenary_Default16",
	"WDL_Mercenary_Default16",
	// PILOTS
	"Pilot_Default1",
	"Pilot_Default2",
	"Pilot_Default3"
	};

  	case east: {
	"MVD_Soldier",
	"MVD_Soldier_AT",
	"MVD_Soldier_GL",
	"MVD_Soldier_MG",
	"MVD_Soldier_Marksman",
	"MVD_Soldier_Sniper",
	"MVD_Soldier_TL",
	"RUS_Commander",
	"RUS_Soldier1",
	"RUS_Soldier2",
	"RUS_Soldier3",
	"RUS_Soldier_GL",
	"RUS_Soldier_Marksman",
	"RUS_Soldier_Sab",
	"RUS_Soldier_TL",
	"RU_Commander",
	"RU_Soldier",
	"RU_Soldier2",
	"RU_Soldier_AA",
	"RU_Soldier_AR",
	"RU_Soldier_AT",
	"RU_Soldier_Crew",
	"RU_Soldier_GL",
	"RU_Soldier_HAT",
	"RU_Soldier_LAT",
	"RU_Soldier_Light",
	"RU_Soldier_MG",
	"RU_Soldier_Marksman",
	"RU_Soldier_Medic",
	"RU_Soldier_Officer",
	"RU_Soldier_Pilot",
	"RU_Soldier_SL",
	"RU_Soldier_Sniper",
	"RU_Soldier_SniperH",
	"RU_Soldier_Spotter",
	"RU_Soldier_TL"
	};

case guer: {
	"G_Mercenary_Default0",
	"G_Mercenary_Default1",
	"G_Mercenary_Default2",
	"G_Mercenary_Default3",
	"G_Mercenary_Default4",
	"G_Mercenary_Default5",
	"G_Mercenary_Default6",
	"G_Mercenary_Default7",
	"G_Mercenary_Default8",
	"G_Mercenary_Default9",
	"G_Mercenary_Default10",
	"G_Mercenary_Default11",
	"G_Mercenary_Default12",
	"G_Mercenary_Default13",
	"G_Mercenary_Default14",
	"G_Mercenary_Default15",
	"G_Mercenary_Default16",
	"G_Mercenary_Default17",
	"G_Mercenary_Default18",
	"G_Mercenary_Default19",
	"G_Mercenary_Default20",
	"G_Mercenary_Default20b",
	"G_Mercenary_Default21",
	"G_Mercenary_Default22",
	"G_Mercenary_Default23",
	"G_Mercenary_Default24",
	"G_Mercenary_Default25",
	"G_Mercenary_Default26",
	"G_Mercenary_Default27",
	"G_Mercenary_Default28",

	"G_WDL_Mercenary_Default0",
	"G_WDL_Mercenary_Default1",
	"G_WDL_Mercenary_Default2",
	"G_WDL_Mercenary_Default3",
	"G_WDL_Mercenary_Default4",
	"G_WDL_Mercenary_Default5",
	"G_WDL_Mercenary_Default6",
	"G_WDL_Mercenary_Default7",
	"G_WDL_Mercenary_Default8",
	"G_WDL_Mercenary_Default9",
	"G_WDL_Mercenary_Default10",
	"G_WDL_Mercenary_Default11",
	"G_WDL_Mercenary_Default12",
	"G_WDL_Mercenary_Default13",
	"G_WDL_Mercenary_Default14",
	"G_WDL_Mercenary_Default15",
	"G_WDL_Mercenary_Default16",
	"G_WDL_Mercenary_Default16",

	"GPilot_Default1",
	"GPilot_Default2",
	"GPilot_Default3"
	};
};

bon_recruit_recruitableunits = [_RECRUIT_LIST];

The original was simply:

bon_recruit_recruitableunits = ["US_Soldier_AA_EP1",
	"US_Soldier_AAT_EP1",
	"US_Soldier_AHAT_EP1",
	"US_Soldier_AAR_EP1",
	"US_Soldier_AMG_EP1",
	"US_Soldier_AT_EP1",
	"US_Soldier_HAT_EP1",
	"US_Soldier_AR_EP1",
	"US_Soldier_Engineer_EP1",
	"US_Soldier_GL_EP1",
	"US_Soldier_MG_EP1",
	"US_Soldier_Marksman_EP1",
	"US_Soldier_Medic_EP1",
	"US_Soldier_EP1",
	"US_Soldier_LAT_EP1",
	"US_Soldier_B_EP1",
	"US_Soldier_SL_EP1"];

The file is a .sqf file, and the original/back-up copy works fine.

Share this post


Link to post
Share on other sites

Missing [] and wrong use of the set command.

And next time, this relates to Scripting & Editing Missions, not addons.

Share this post


Link to post
Share on other sites

@Faulk Wulf:

It only returns the last entry, because you don't fill any array...

Try this:

switch (side player)  do
{
 case west: 
 {
       bon_recruit_recruitableunits = [ 
       "US_Soldier_AA_EP1",
       "US_Soldier_AAT_EP1",
       "US_Soldier_AHAT_EP1",
       "US_Soldier_AAR_EP1",
       "US_Soldier_AMG_EP1",
       "US_Soldier_AT_EP1",
       "US_Soldier_HAT_EP1",
       "US_Soldier_AR_EP1",
       "US_Soldier_Engineer_EP1",
       "US_Soldier_GL_EP1",
       "US_Soldier_MG_EP1",
       "US_Soldier_Marksman_EP1",
       "US_Soldier_Medic_EP1",
       "US_Soldier_EP1",
       "US_Soldier_LAT_EP1",
       "US_Soldier_B_EP1",
       "US_Soldier_SL_EP1",
               // MERCS
       "Mercenary_Default0",
       "Mercenary_Default1",
       "Mercenary_Default2",
       "Mercenary_Default3",
       "Mercenary_Default4",
       "Mercenary_Default5",
       "Mercenary_Default6",
       "Mercenary_Default7",
       "Mercenary_Default8",
       "Mercenary_Default9",
       "Mercenary_Default10",
       "Mercenary_Default11",
       "Mercenary_Default12",
       "Mercenary_Default13",
       "Mercenary_Default14",
       "Mercenary_Default15",
       "Mercenary_Default16",
       "Mercenary_Default17",
       "Mercenary_Default18",
       "Mercenary_Default19",
       "Mercenary_Default20",
       "Mercenary_Default20b",
       "Mercenary_Default21",
       "Mercenary_Default22",
       "Mercenary_Default23",
       "Mercenary_Default24",
       "Mercenary_Default25",
       "Mercenary_Default26",
       "Mercenary_Default27",
       "Mercenary_Default28",
               // WOODLAND MERCS
       "WDL_Mercenary_Default0",
       "WDL_Mercenary_Default1",
       "WDL_Mercenary_Default2",
       "WDL_Mercenary_Default3",
       "WDL_Mercenary_Default4",
       "WDL_Mercenary_Default5",
       "WDL_Mercenary_Default6",
       "WDL_Mercenary_Default7",
       "WDL_Mercenary_Default8",
       "WDL_Mercenary_Default9",
       "WDL_Mercenary_Default10",
       "WDL_Mercenary_Default11",
       "WDL_Mercenary_Default12",
       "WDL_Mercenary_Default13",
       "WDL_Mercenary_Default14",
       "WDL_Mercenary_Default15",
       "WDL_Mercenary_Default16",
       "WDL_Mercenary_Default16",
       // PILOTS
       "Pilot_Default1",
       "Pilot_Default2",
       "Pilot_Default3"
       ];
 };

 case east: 
 {
   bon_recruit_recruitableunits = [
       "MVD_Soldier",
       "MVD_Soldier_AT",
       "MVD_Soldier_GL",
       "MVD_Soldier_MG",
       "MVD_Soldier_Marksman",
       "MVD_Soldier_Sniper",
       "MVD_Soldier_TL",
       "RUS_Commander",
       "RUS_Soldier1",
       "RUS_Soldier2",
       "RUS_Soldier3",
       "RUS_Soldier_GL",
       "RUS_Soldier_Marksman",
       "RUS_Soldier_Sab",
       "RUS_Soldier_TL",
       "RU_Commander",
       "RU_Soldier",
       "RU_Soldier2",
       "RU_Soldier_AA",
       "RU_Soldier_AR",
       "RU_Soldier_AT",
       "RU_Soldier_Crew",
       "RU_Soldier_GL",
       "RU_Soldier_HAT",
       "RU_Soldier_LAT",
       "RU_Soldier_Light",
       "RU_Soldier_MG",
       "RU_Soldier_Marksman",
       "RU_Soldier_Medic",
       "RU_Soldier_Officer",
       "RU_Soldier_Pilot",
       "RU_Soldier_SL",
       "RU_Soldier_Sniper",
       "RU_Soldier_SniperH",
       "RU_Soldier_Spotter",
       "RU_Soldier_TL"
     ];
 };

 case guer: 
 {
   bon_recruit_recruitableunits = [
       "G_Mercenary_Default0",
       "G_Mercenary_Default1",
       "G_Mercenary_Default2",
       "G_Mercenary_Default3",
       "G_Mercenary_Default4",
       "G_Mercenary_Default5",
       "G_Mercenary_Default6",
       "G_Mercenary_Default7",
       "G_Mercenary_Default8",
       "G_Mercenary_Default9",
       "G_Mercenary_Default10",
       "G_Mercenary_Default11",
       "G_Mercenary_Default12",
       "G_Mercenary_Default13",
       "G_Mercenary_Default14",
       "G_Mercenary_Default15",
       "G_Mercenary_Default16",
       "G_Mercenary_Default17",
       "G_Mercenary_Default18",
       "G_Mercenary_Default19",
       "G_Mercenary_Default20",
       "G_Mercenary_Default20b",
       "G_Mercenary_Default21",
       "G_Mercenary_Default22",
       "G_Mercenary_Default23",
       "G_Mercenary_Default24",
       "G_Mercenary_Default25",
       "G_Mercenary_Default26",
       "G_Mercenary_Default27",
       "G_Mercenary_Default28",

       "G_WDL_Mercenary_Default0",
       "G_WDL_Mercenary_Default1",
       "G_WDL_Mercenary_Default2",
       "G_WDL_Mercenary_Default3",
       "G_WDL_Mercenary_Default4",
       "G_WDL_Mercenary_Default5",
       "G_WDL_Mercenary_Default6",
       "G_WDL_Mercenary_Default7",
       "G_WDL_Mercenary_Default8",
       "G_WDL_Mercenary_Default9",
       "G_WDL_Mercenary_Default10",
       "G_WDL_Mercenary_Default11",
       "G_WDL_Mercenary_Default12",
       "G_WDL_Mercenary_Default13",
       "G_WDL_Mercenary_Default14",
       "G_WDL_Mercenary_Default15",
       "G_WDL_Mercenary_Default16",
       "G_WDL_Mercenary_Default16",

       "GPilot_Default1",
       "GPilot_Default2",
       "GPilot_Default3"
   ];
 };
};

// Show list in a hintbox
hintsilent format["Recruitable units:\n%1",bon_recruit_recruitableunits];

Share this post


Link to post
Share on other sites

Big Big ugly switch . altho nothing wrong with that.

but i would prefer a more readeble way.

[color=#000000][color=#0000bb]#define recruit_recruitableWESTunits[/color][/color]  [[color=#000000][color=#dd0000]"US_Soldier_AA_EP1"[/color][color=#007700],...][/color][/color]
[color=#000000][color=#0000bb]#define recruit_recruitableEASTunits  [/color][color=#007700][[/color][color=#dd0000]"MVD_Soldier"[/color][color=#007700],...][/color][/color][color=#000000][color=#0000bb]
#define recruit_recruitableGUERunits  [/color][color=#007700][[/color][color=#dd0000]"G_Mercenary_Default0"[/color][color=#007700],...]
[/color][/color]
ps. to use multiline with a define you need to use  \
#define blah [\
foo,\
bar,\
moo]

or even put that in a seperate file, example defines.sqf then use 
#include "path\defines.sqf"

[color=#000000][color=#0000bb]recruit_recruitableunits[/color][/color] = [];
[color=#000000][color=#007700]switch ([/color][color=#0000bb]side player[/color][color=#007700]) do 
{
 case [/color][color=#0000bb]west[/color][color=#007700]: {[/color][/color][color=#000000][color=#0000bb]recruit_recruitableunits[/color][/color] = [color=#000000][color=#0000bb]recruit_recruitableWESTunits[/color][/color];};
 case east: {[color=#000000][color=#0000bb]recruit_recruitableunits[/color][/color] = [color=#000000][color=#0000bb]recruit_recruitableEASTunits[/color][/color];};
 case guer: {[color=#000000][color=#0000bb]recruit_recruitableunits[/color][/color] = [color=#000000][color=#0000bb]recruit_recruitableGUERunits[/color][/color];};
};

i find it much more easy to read this way

Edited by nuxil

Share this post


Link to post
Share on other sites
Big Big ugly switch . altho nothing wrong with that.

but i would prefer a more readeble way.

[color=DarkOrange][b]#define recruit_recruitableWESTunits  ["US_Soldier_AA_EP1",...]
#define recruit_recruitableEASTunits  ["MVD_Soldier",...][/b][/color] [color=#000000][color=DarkOrange][b]
#define recruit_recruitableGUERunits  ["G_Mercenary_Default0"[/b][/color][color=#007700][color=DarkOrange][b],...][/b][/color]
[/color][/color]
ps. to use multiline with a define you need to use  \
#define blah [ \
foo, \
bar, \
moo]

or even put that in a seperate file, example defines.sqf then use 
#include "path\defines.sqf"

[color=#000000][color=#0000bb]recruit_recruitableunits[/color][/color] = [];
[color=#000000][color=#007700]switch ([/color][color=#0000bb]side player[/color][color=#007700]) do 
{
 case [/color][color=#0000bb]west[/color][color=#007700]: {[/color][/color][color=#000000][color=#0000bb]recruit_recruitableunits[/color][/color] = [color=#000000][color=#0000bb]recruit_recruitableWESTunits[/color][/color];};
 case east: {[color=#000000][color=#0000bb]recruit_recruitableunits[/color][/color] = [color=#000000][color=#0000bb]recruit_recruitableEASTunits[/color][/color];};
 case guer: {[color=#000000][color=#0000bb]recruit_recruitableunits[/color][/color] = [color=#000000][color=#0000bb]recruit_recruitableGUERunits[/color][/color];};
};

i find it much more easy to read this way

The file is a .sqf file, and the original/back-up copy works fine.

I don't like to use "#define" in a .sqf file ...

.. what is better readable ???

#define blah [\
foo,\
bar,\
moo]

units = blah;

or


blah=[
foo,
bar,
moo]

units= blah;

but of course ... my script is ugly.

1) get it running

2) make it nice

I prefer to give a hint/solution. Not the "best in all ways".

People should use their own brain too. :rolleyes:

Learning by doing......

Edited by HeliJunkie

Share this post


Link to post
Share on other sites

using define or not is just matter of choice. some like it some dont.

i like to put my "uglyness" in a define file. which make my other scrips more readeble.

i find it more readeble because i dont have to look at a 200 line switch.

but instead 3 line switch

Share this post


Link to post
Share on other sites

Doesn't the use of preprocessor commands seriously mess up line reporting on errors? There are cases, also in sqf, when I think they are great as they can seriously reduce the memory requirements while running (at least I think that is the big benefit). I.e. in Domination, the whole thing is based a lot on #ifdef #ifndef #else and #endif. If defined, it is included and executed. But if not defined, that part is now completely removed during preprocessing, so that memory is freed.

The same with multiline macro defines replacing (especially) global script snippets. I.e. you can have several spawns in a script which cannot reference a _local script snippet outside their scope, but a defined macro will be put into wherever it is used, during preprocessing.

But yeah, I tend to think twice before putting them to use, especially during script development or large scripts, due to how preprocessing commands messes with line reports.

Share this post


Link to post
Share on other sites

Doesn't the use of preprocessor commands seriously mess up line reporting on errors?

it sure does.

but the trick is. if its not producing error and you see its not working. its most likely one of you define missing something. all from " , } ] so on.

variables to only have 1 value i find usefull to #define the verry much same way you do in "atleat i" with dialogs.

#define gray {0.5,0.5,0.5,0.5}

instead of typing {0.5,0.5,0.5,0.5} over and over again. once just use _color = gray;

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×