Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oscar-broman/bdf76d96069e443b6ba50e90f354afec to your computer and use it in GitHub Desktop.
Save oscar-broman/bdf76d96069e443b6ba50e90f354afec to your computer and use it in GitHub Desktop.
macro-test.pwn
#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