dev icon indicating copy to clipboard operation
dev copied to clipboard

elseif and switch Support

Open HzanRsxa2959 opened this issue 3 years ago • 9 comments

If elseif support is added first, then switch support could be derived from that. Otherwise switch support could be added using opcodes 0871 and 0872 (only support integers, though). GTA3Script already has nested switch support using opcodes 0871 and 0872.

HzanRsxa2959 avatar Jul 24 '21 06:07 HzanRsxa2959

Maybe it is better with conditional jump opcodes

switch 0@
    case 1
        [...]
    end
    case "2"
        [...]
    end
    case Actor.IsDead()
        [...]
    case 0x4
        [...]
    end
    default
        [...]
    end
end

TO COMPILE AND DECOMPILE ⬇

:LABEL_1X // begin SWITH
XXXX: if
XXXX: 0@ == 1  // CASE 1
XXXX: jf @LABEL_2X
[...]
XXXX: goto @LABEL_7 // exit SWITH
:LABEL_2X
XXXX: if
XXXX: 0@ == "2"  // CASE 2
XXXX: jf @LABEL_3X
[...]
XXXX: goto @LABEL_7 // exit SWITH
:LABEL_3X
XXXX: if
XXXX: actor 0@ is_dead  // CASE 3
XXXX: jf @LABEL_5X
[...]
:LABEL_4X
XXXX: if
XXXX: 0@ == 0x4  // CASE 4
XXXX: jf @LABEL_5X
[...]
XXXX: goto @LABEL_7X // exit SWITH
:LABEL_5X
[...]          // DEFAULT
XXXX: goto @LABEL_7X
:LABEL_7X // end SWITH

MatiDragon-YT avatar Jul 26 '21 23:07 MatiDragon-YT

The same I think could be applied to ELSE-IF

if 0@ == 1
    [...]
else if 0@ == "5"
    [...]
else
    [...]
end

TO COMPILE AND DECOMPILE ⬇

:LABEL_1X // begin ELSE-IF
XXXX: if
XXXX: 0@ == 1   // if
XXXX: jf @LABEL_2X
[...]
XXXX: goto @LABEL_4X // exit ELSE-IF
:LABEL_2X
XXXX: if
XXXX: 0@ == "5"   // else if
XXXX: jf @LABEL_3X
[...]
XXXX: goto @LABEL_4X // exit ELSE-IF
:LABEL_3X
[...]           // else
:LABEL_4X // end ELSE-IF

MatiDragon-YT avatar Jul 26 '21 23:07 MatiDragon-YT

Maybe it is better with conditional jump opcodes

switch 0@
    case 1
        [...]
    end
    case "2"
        [...]
    end
    case Actor.IsDead()
        [...]
    case 0x4
        [...]
    end
    default
        [...]
    end
end

TO COMPILE AND DECOMPILE ⬇

:LABEL_1X // begin SWITH
XXXX: if
XXXX: 0@ == 1  // CASE 1
XXXX: jf @LABEL_2X
[...]
XXXX: goto @LABEL_7 // exit SWITH
:LABEL_2X
XXXX: if
XXXX: 0@ == "2"  // CASE 2
XXXX: jf @LABEL_3X
[...]
XXXX: goto @LABEL_7 // exit SWITH
:LABEL_3X
XXXX: if
XXXX: actor 0@ is_dead  // CASE 3
XXXX: jf @LABEL_5X
[...]
:LABEL_4X
XXXX: if
XXXX: 0@ == 0x4  // CASE 4
XXXX: jf @LABEL_5X
[...]
XXXX: goto @LABEL_7X // exit SWITH
:LABEL_5X
[...]          // DEFAULT
XXXX: goto @LABEL_7X
:LABEL_7X // end SWITH

It is best for SA to give priority to 0871 and 0872. Conditional opcodes need to be distinguished, But the latter is more suitable for VC and 3. Because VC and 3 do not have these commands

XMDS avatar Jul 27 '21 09:07 XMDS

0871 & 0872 could be used in the case that the SWITCH only contains INTERGERS and if it is also the same as the one with which it is compared. You couldn't tell if one number is greater than another or something else :(

MatiDragon-YT avatar Jul 27 '21 14:07 MatiDragon-YT

@MatiDragon-YT

0871 & 0872 could be used in the case that the SWITCH only contains INTERGERS and if it is also the same as the one with which it is compared. You couldn't tell if one number is greater than another or something else :(

It looks more like "expressions (mapping)" than a classic "switch". However, design compatibility across all games would be a priority for me over a limited case jump table.

wmysterio avatar Jul 28 '21 04:07 wmysterio

It looks more like "expressions (mapping)" than a classic "switch".

Exactly @wmysterio

MatiDragon-YT avatar Jul 29 '21 00:07 MatiDragon-YT

Two examples of the switch construct as used in the original source file, Girls.sc - the 2nd example includes a default_jump [true] for when no cases match the key variable:

/********************************************
GET CURRENT GIRLFRIEND ORIGIN XYZ & HEADING
********************************************/
GF_Dating_Agent_GetOrigin_X_Y_Z_H:
	SWITCH iGFidx

		CASE COOCHIE 
			fOriginX 	= 2401.9646
			fOriginY 	= -1723.2197
			fOriginZ 	= 12.6005
			fOriginH	= 180.0		    
		BREAK

		CASE MICHELLE
			fOriginX 	= -1799.5 
			fOriginY 	= 1195.5 
			fOriginZ 	= 24.1094 
			fOriginH	= 180.0
		BREAK

		CASE KYLIE
			fOriginX 	= -377.3978 //-398.5166    89.8377
			fOriginY 	= -1438.6919 //-1426.4675 
			fOriginZ 	= 24.7209 //24.7110 
			fOriginH	= 270.0 //90.0
		BREAK

		CASE BARBARA
			fOriginX 	= -1398.1010 
			fOriginY 	= 2636.8730 
			fOriginZ 	= 54.7031 
			fOriginH	= 75.0	
		BREAK

		CASE KATIE
			fOriginX 	= -2576.8079 
			fOriginY 	= 1144.7438 
			fOriginZ 	= 54.7422
			fOriginH	= 164.0
		BREAK

		CASE MILLIE
			fOriginX = 2035.3619  
			fOriginY = 2732.4106  
			fOriginZ = 9.8203
			fOriginH = 0.0			
		BREAK

	ENDSWITCH
RETURN
/********************************************
	GET GF MEETING ORIGIN XYZ & HEADING
********************************************/
GF_Dating_Agent_GetMeetingOrigin_X_Y_Z_H:
	SWITCH iGFidx

		CASE MICHELLE
			fOriginX 	= -2027.5835 
			fOriginY 	= -118.7022 
			fOriginZ 	= 1034.0 
			fOriginH	= 3.4
		BREAK

		CASE KYLIE
			fOriginX 	= 257.6682 
			fOriginY 	= -154.7475 
			fOriginZ 	= 4.0786 
			fOriginH	= 268.7731
		BREAK

		CASE BARBARA
			fOriginX 	= -1410.0997 
			fOriginY 	= 2648.7307 
			fOriginZ 	= 54.6875
			fOriginH	= 130.0
		BREAK

		CASE KATIE // commented the co-ords inside the gym, temporarily set her in a park nearby
			fOriginX 	= -2291.7075 //762.9347 
			fOriginY 	= -233.0215 //-23.3127 
			fOriginZ 	= 41.7185 //999.5938 
			fOriginH	= 360.0 //360.0
		BREAK

		DEFAULT
			fOriginX 	= 0.0 
			fOriginY 	= 0.0 
			fOriginZ 	= 0.0 
			fOriginH	= 0.0
		BREAK

	ENDSWITCH
RETURN

OrionSR avatar Sep 06 '23 18:09 OrionSR

// switch on int value
switch 0@

   case 1, 2, 3
    // do something if 0@ == 1 or 2 or 3

   case 5
    // do something if 0@ == 5

   default // optional

   // do something otherwise

end
// switch on string value
switch 0@v

   case "foo"
    // do something if 0@s == "foo"

   case "bar"
    // do something if 0@s == "bar"

end

x87 avatar Nov 21 '23 23:11 x87

Switch is implemented. Any chance for elif?

MiranDMC avatar Jul 23 '24 00:07 MiranDMC