Created
July 14, 2016 09:31
-
-
Save oscar-broman/bdf76d96069e443b6ba50e90f354afec to your computer and use it in GitHub Desktop.
macro-test.pwn
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <a_samp> | |
// Enclose statement | |
#define ENC: \ | |
(_:E1:E2:E3:E4:E5:E6:E7:E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0, | |
#define ENC_END: \ | |
) | |
#define E1:E2:E3:E4:E5:E6:E7:E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1\32;%2 ENC_2:%1 ENC_END: | |
#define E2:E3:E4:E5:E6:E7:E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1> ENC_2:%1 ENC_END:> | |
#define E3:E4:E5:E6:E7:E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1< ENC_2:%1 ENC_END:< | |
#define E4:E5:E6:E7:E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1| ENC_2:%1 ENC_END:| | |
#define E5:E6:E7:E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1& ENC_2:%1 ENC_END:& | |
#define E6:E7:E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1^ ENC_2:%1 ENC_END:^ | |
#define E7:E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1, ENC_2:%1 ENC_END:, | |
#define E8:E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1) ENC_2:%1 ENC_END:) | |
#define E9:E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1] ENC_2:%1 ENC_END:] | |
#define E10:E11:E12:E13:E14:E15:E16:E17:E18:0,%1/ ENC_2:%1 ENC_END:/ | |
#define E11:E12:E13:E14:E15:E16:E17:E18:0,%1* ENC_2:%1 ENC_END:* | |
#define E12:E13:E14:E15:E16:E17:E18:0,%1^ ENC_2:%1 ENC_END:^ | |
#define E13:E14:E15:E16:E17:E18:0,%1% ENC_2:%1 ENC_END:% | |
#define E14:E15:E16:E17:E18:0,%1- ENC_2:%1 ENC_END:- | |
#define E15:E16:E17:E18:0,%1+ ENC_2:%1 ENC_END:+ | |
#define E16:E17:E18:0,%1= ENC_2:%1 ENC_END:= | |
#define E17:E18:0,%1; ENC_2:%1 ENC_END:; | |
#define E18:0,%1\10;%2 0,%1 ENC_END: | |
#define ENC_2: \ | |
e1:e2:e3:e4:e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0, | |
#define e1:e2:e3:e4:e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1!%2\32;%3ENC_END: e2:e3:e4:e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:!%2 | |
#define e2:e3:e4:e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1>%2\32;%3ENC_END: e3:e4:e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:>%2 | |
#define e3:e4:e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1<%2\32;%3ENC_END: e4:e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:<%2 | |
#define e4:e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1|%2\32;%3ENC_END: e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:|%2 | |
#define e5:e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1&%2\32;%3ENC_END: e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:&%2 | |
#define e6:e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1^%2\32;%3ENC_END: e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:^%2 | |
#define e7:e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1;%2\32;%3ENC_END: e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:;%2 | |
#define e8:e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1)%2\32;%3ENC_END: e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:)%2 | |
#define e9:e10:e11:e12:e13:e14:e15:e16:e17:0,%1]%2\32;%3ENC_END: e10:e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:]%2 | |
#define e10:e11:e12:e13:e14:e15:e16:e17:0,%1/%2\32;%3ENC_END: e11:e12:e13:e14:e15:e16:e17:0,%1 ENC_END:/%2 | |
#define e11:e12:e13:e14:e15:e16:e17:0,%1*%2\32;%3ENC_END: e12:e13:e14:e15:e16:e17:0,%1 ENC_END:*%2 | |
#define e12:e13:e14:e15:e16:e17:0,%1^%2\32;%3ENC_END: e13:e14:e15:e16:e17:0,%1 ENC_END:^%2 | |
#define e13:e14:e15:e16:e17:0,%1%%2\32;%3ENC_END: e14:e15:e16:e17:0,%1 ENC_END:%%2 | |
#define e14:e15:e16:e17:0,%1-%2\32;%3ENC_END: e15:e16:e17:0,%1 ENC_END:-%2 | |
#define e15:e16:e17:0,%1+%2\32;%3ENC_END: e16:e17:0,%1 ENC_END:+%2 | |
#define e16:e17:0,%1=%2\32;%3ENC_END: e17:0,%1 ENC_END:=%2 | |
#define e17:0,%1,%2\32;%3ENC_END: 0,%1 ENC_END:,%2 | |
// Strip trailing comma | |
#define MODEL_ARGS: \ | |
_:@MA1: | |
#define @MA1:(%1),) \ | |
%1) | |
// Swap [1][2] to [2][1] | |
#define ARRCHK:0,%1 @AR1:@AR2:@AR3:0, | |
#define ARRDELIM: | |
#define @AR1:@AR2:@AR3:0,%1.%2ENCEND: @AR3:0,%1.ARRDELIM:%2ENCEND: | |
#define @AR2:@AR3:0,%1ENC_END: @AR3:0,%1ENC_END:ARRDELIM: | |
#define @AR3:0,%1[%2]%3[%4]%5ARRDELIM: 0,%1[%4]%3[%2]%5ARRDELIM: | |
#define REFERENCE(%1.%2[%3]=>%4) \ | |
@%4[%1_%2[%3]]. | |
#define FUNCTION(%1)(%2)[%4] \ | |
%1(MODEL_ARGS:(%4),%2) | |
// --------------------------------------------------------- | |
// Player model | |
// --------------------------------------------------------- | |
// Basics | |
#define Player[%1]. ENC:@Player[%1]. | |
#define @Player @Player1:@Player2:0, | |
#define @Player1:@Player2:0,[%1].%2.%3ENC_END: ARRCHK:Player_%2[%1].%3ENC_END: | |
#define @Player2:0,[%1].%2ENC_END: ARRCHK:0,Player_%2[%1]ENC_END: | |
// Functions | |
#define Player_addXp(%1)%2[%3] FUNCTION(Player_addXp)(%1)[%3] | |
// References | |
#define Player_gang[%1]. REFERENCE(Player.gang[%1]=>Gang) | |
// Variables | |
new Player_gang[MAX_PLAYERS] = {-1, ...}; | |
new Player_xp[MAX_PLAYERS]; | |
new Player_level[MAX_PLAYERS]; | |
// Functions | |
stock Player_addXp(p, xp) { | |
Player[p].xp += xp; | |
// Every 100 xp is a new level | |
while (Player[p].xp > 100) { | |
Player[p].xp -= 100; | |
Player[p].level++; | |
} | |
} | |
// --------------------------------------------------------- | |
// Gang model | |
// --------------------------------------------------------- | |
// Basics | |
#define Gang[%1]. ENC:@Gang[%1]. | |
#define @Gang @Gang1:@Gang2:0, | |
#define @Gang1:@Gang2:0,[%1].%2.%3ENC_END: ARRCHK:Gang_%2[%1].%3ENC_END: | |
#define @Gang2:0,[%1].%2ENC_END: ARRCHK:0,Gang_%2[%1]ENC_END: | |
// Functions | |
#define Gang_updateMembers(%1)%2[%3] Gang_updateMembers(MODEL_ARGS:(%3),%1)%2 | |
// References | |
#define Gang_members%1.%2ENC_END: @GM1:@GM2:@GM3:0,Gang_members%1.%2ENC_END: | |
#define @GM1:@GM2:@GM3:0,Gang_members[%1][%2]. @Player[Gang_members[%2][%1]]. | |
#define @GM2:@GM3:0,Gang_members[%1].%2ENC_END: Gang_members_%2[%1]ENC_END: | |
#define Gang_members_loop(%1)%2[%3]%4ENC_END: \ | |
0,DM@d=DM@d+0); \ | |
Gang[%3].updateMembers(); \ | |
for(new __i = 0, %1;__i<sizeof(Gang_members[]);__i++) \ | |
if((%1 = Gang_members[%3][__i])==-1){continue;}else | |
stock DM@d; | |
// Variables | |
#define MAX_GANGS 20 | |
new Gang_members[MAX_GANGS][MAX_PLAYERS]; | |
new Gang_name[MAX_GANGS][32]; | |
new Gang_score[MAX_GANGS]; | |
// Functions | |
stock Gang_updateMembers(g) { | |
new slot = 0; | |
for (new p = 0; p < MAX_PLAYERS; p++) { | |
if (Player[p].gang == g) { | |
Gang[g].members[slot++] = p; | |
} | |
} | |
// Fill the rest with -1 | |
while (slot < MAX_PLAYERS) { | |
Gang[g].members[slot++] = -1; | |
} | |
} | |
// --------------------------------------------------------- | |
// Usage | |
// --------------------------------------------------------- | |
main() { | |
Gang[3].name = "the best gang"; | |
Player[7].gang = 3; | |
Player[11].gang = 3; | |
Gang[3].members.loop(p) { | |
printf("player %d is in gang 3", p); | |
Player[p].addXp(250); | |
} | |
Player[11].gang.score += 13; | |
printf("Gang 3 has score: %d", Gang[3].score); | |
printf("player %d has %d xp", | |
Gang[3].members[1], | |
Gang[3].members[1].xp | |
); | |
printf( | |
"player 11 is in gang: %s", | |
Player[11].gang.name | |
); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment