Merge branch 'release_1.3' of https://github.com/assaultcube/AC into release_1.3
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
# AssaultCube Pragmatic Governance Model (ACPGM)
|
||||
|
||||
Status: Draft
|
||||
|
||||
## Purpose
|
||||
|
||||
AssaultCube is an open-source project maintained by various people around the globe. These people invest their free time and consider their involvement as a hobby.
|
||||
Because people come and go, there is an inherent risk that ownership of the project will be lost and a power vacuum will bog the project down.
|
||||
|
||||
ACPGM is a lightweight governance model that supports the continuity and longevity of the project. It is designed to support the people involved in moving the project forward.
|
||||
It is simple enough to be practically useful and complex enough to prevent ambiguity. After all, it should be fun to engage in the project - nobody wants bureaucracy.
|
||||
ACPGM is not legally binding and does not constitute a legal entity.
|
||||
|
||||
## Community
|
||||
|
||||
- The number of community members must be at lest twenty. The community decides with relative majority vote.
|
||||
- Rights
|
||||
- The community owns AssaultCube.
|
||||
- The community elect the members of the committee. This election is held once a year in February in the AC forum.
|
||||
- If the committee excludes a community member, the community members can reject this decision.
|
||||
- The community decides on proposed changes to this governance model.
|
||||
- Community members shall donate USD $25 per year through the existing donation mechanism to pay the bills for hosting (includes masterserver, forum, website, wiki). Surplus amounts can be used for AC tournaments.
|
||||
- Applications for joining shall be addressed to the committee which shall decide upon acceptance or non-acceptance.
|
||||
|
||||
## Committee
|
||||
|
||||
- The number of committee members must be at least three. The committee decides with relative majority vote.
|
||||
- The goal of the committee is to
|
||||
- Ensure the longevity of the project
|
||||
- Balance tradition with innovation
|
||||
- Promotion of young talents
|
||||
- Rights
|
||||
- The committee may invite or exclude community members any time.
|
||||
- The committee may invite or exclude platform team members any time.
|
||||
- The committee may invite or exclude dev team members any time.
|
||||
- The committee decides which of the committee member has the role of the _Chairman_. The Chairman represents the committee towards others to simplify communication.
|
||||
- The committee has full authority of the project if not stated otherwise in this governance model.
|
||||
|
||||
## Platform Team
|
||||
|
||||
- The number of platform team members is at least three. The platform team is self-organizing.
|
||||
- The goal of the platform team is to
|
||||
- Keep up the game infrastructure and protect the game from attacks and abuse
|
||||
- Provide the service of fair and transparent moderation and game jurisidication (e.g. bans)
|
||||
- Establish welcoming culture and support civil/non-violent discussions
|
||||
- Rights
|
||||
- The platform team operates the infrastructure of AssaultCube and governs all administrative rights/permissions.
|
||||
- The platform team represents the highest decision authority in terms of community moderation and game jurisidication.
|
||||
- The platform team dedices which of the platform team member has the role of the team lead. The team lead represents the platform team towards others to simplify communication.
|
||||
- The platform team publishes its own policies regarding community moderation and game jurisidication.
|
||||
|
||||
## Dev Team
|
||||
|
||||
- The number of dev team members is at least three. The dev team is self-organizing.
|
||||
- The goal of the dev team is to
|
||||
- Conceptualize and execute a Strategy for AC [1]
|
||||
- Publish an AC release at least once a year [2]
|
||||
- Actively acquire new talents for the project and provide mentorship
|
||||
- Rights
|
||||
- The dev team dedices on development priorites, inclusion of features and bugfixes
|
||||
- The dev team may change minor gameplay-relevant aspects of the game, major aspects require approval by the committee [3]
|
||||
- The dev team dedices which of the dev team member has the role of the team lead. The team lead represents the dev team towards others to simplify communication.
|
||||
|
||||
## More
|
||||
|
||||
- Experience shows that people find it difficult to have multiple roles (different "hats") and to apply the right role depending on the context. Therefore, a person can *formally* belong to only one of these three groups: committee, dev team, platform team. In practice however, people can support the project in different areas.
|
||||
|
||||
## Remarks
|
||||
|
||||
[1] The people that want to put their time into improving and advancing AC to the next level should be provided a lot of freedom. This makes the project attractive for talents. The people that have the ideas should be the same people that build the stuff. Therefore it is better to give the dev team authority over vision/strategy instead of giving this authrity to the committee. The committee can still influence the broad direction of the project by setting up the dev team accordingly.
|
||||
|
||||
[2] This ensure the knowledge of publishing a release remains active. A release could potentially only contain new maps/media worst-case.
|
||||
|
||||
[3] Example: Minor gameplay change would be making the physics of nades more realistic; major gameplay change would be tweaking gun damage.
|
||||
@@ -849,8 +849,8 @@ menuinit [
|
||||
menuitem "\f3[ Delete vantage point ]" clearvantagepoint
|
||||
menuitem "" -1
|
||||
]
|
||||
]]
|
||||
if(! $connected) [
|
||||
]
|
||||
if (! $connected) [
|
||||
menuitem "\f0[ Set current position and viewing angle as map vantage point ]" setvantagepoint
|
||||
]
|
||||
]
|
||||
|
||||
@@ -431,16 +431,19 @@ void voicecom(char *sound, char *text)
|
||||
int s = audiomgr.findsound(soundpath, 0, gamesounds);
|
||||
if(!gamesound_isvoicecom(s)) return;
|
||||
if(voicecomsounds>0) audiomgr.playsound(s, SP_HIGH);
|
||||
if(gamesound_ispublicvoicecom(s)) // public
|
||||
if(gamesound_ispublicvoicecom(s)||(!m_teammode&&gamesound_ispublicwhenffa(s))) // public
|
||||
{
|
||||
addmsg(SV_VOICECOM, "ri", s);
|
||||
toserver(text);
|
||||
}
|
||||
else // team
|
||||
{
|
||||
addmsg(SV_VOICECOMTEAM, "ri", s);
|
||||
defformatstring(teamtext)("%c%s", '%', text);
|
||||
toserver(teamtext);
|
||||
if(gamesound_isflagvoicecom(s)?!m_flags_:true)
|
||||
{
|
||||
addmsg(SV_VOICECOMTEAM, "ri", s);
|
||||
defformatstring(teamtext)("%c%s", '%', text);
|
||||
toserver(teamtext);
|
||||
}
|
||||
}
|
||||
last = lastmillis;
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ enum
|
||||
#define m_mp(mode) (m_valid(mode) && (mode)>=0 && (mode)!=7 && (mode)!=8 && (mode)!=12 && ((mode)<18 || (mode)>21))
|
||||
#define m_demo (gamemode==-1)
|
||||
#define m_coop (gamemode==1)
|
||||
#define m_flags_ (m_ctf || m_htf || m_ktf) // trailing underscore is required to prevent name clash on FreeBSD systems
|
||||
#define m_flags_ (m_ctf || m_htf || m_ktf) // trailing underscore is required to prevent name clash on FreeBSD systems
|
||||
#define m_isdemo(x) ((x) == -1)
|
||||
|
||||
// single filter modes
|
||||
|
||||
@@ -220,7 +220,7 @@ void renderscore(playerent *d)
|
||||
|
||||
if(m_flags_) line.addcol(sc_flags, "%d", d->flagscore);
|
||||
line.addcol(sc_frags, "%d", d->frags);
|
||||
line.addcol(sc_deaths, "%d", 99);
|
||||
line.addcol(sc_deaths, "%d", d->deaths);
|
||||
line.addcol(sc_ratio, "%.2f", SCORERATIO(d->frags, d->deaths));
|
||||
if(multiplayer(NULL) || watchingdemo) line.addcol(sc_lag, "%s", lagping);
|
||||
|
||||
|
||||
+9
-9
@@ -619,14 +619,14 @@ soundcfgitem soundcfg[S_NULL] =
|
||||
{ "misc/tinnitus", "Tinnitus", 2, 0, 0, S_TINNITUS, C(OWNPAIN) }, // 62
|
||||
{ "voicecom/affirmative", "Affirmative", 0, 0, 0, S_AFFIRMATIVE, C(VOICECOM)|C(TEAM) }, // 63
|
||||
{ "voicecom/allrightsir", "All-right sir", 0, 0, 0, S_ALLRIGHTSIR, C(VOICECOM)|C(TEAM) }, // 64
|
||||
{ "voicecom/comeonmove", "Come on, move", 0, 0, 0, S_COMEONMOVE, C(VOICECOM)|C(TEAM)|C(PUBLIC)|C(FFA) }, // 65
|
||||
{ "voicecom/comeonmove", "Come on, move", 0, 0, 0, S_COMEONMOVE, C(VOICECOM)|C(TEAM) |C(FFA) }, // 65
|
||||
{ "voicecom/cominginwiththeflag", "Coming in with the flag", 0,0,0, S_COMINGINWITHTHEFLAG, C(VOICECOM)|C(TEAM) |C(FLAGONLY) }, // 66
|
||||
{ "voicecom/coverme", "Cover me", 0, 0, 0, S_COVERME, C(VOICECOM)|C(TEAM) }, // 67
|
||||
{ "voicecom/defendtheflag", "Defend the flag", 0, 0, 0, S_DEFENDTHEFLAG, C(VOICECOM)|C(TEAM) |C(FLAGONLY) }, // 68
|
||||
{ "voicecom/enemydown", "Enemy down", 0, 0, 0, S_ENEMYDOWN, C(VOICECOM)|C(TEAM)|C(PUBLIC) }, // 69
|
||||
{ "voicecom/enemydown", "Enemy down", 0, 0, 0, S_ENEMYDOWN, C(VOICECOM)|C(TEAM) |C(FFA) }, // 69
|
||||
{ "voicecom/gogetemboys", "Go get 'em boys!", 0, 0, 0, S_GOGETEMBOYS, C(VOICECOM)|C(TEAM) }, // 70
|
||||
{ "voicecom/goodjobteam", "Good job team", 0, 0, 0, S_GOODJOBTEAM, C(VOICECOM)|C(TEAM) }, // 71
|
||||
{ "voicecom/igotone", "I got one!", 0, 0, 0, S_IGOTONE, C(VOICECOM)|C(TEAM)|C(PUBLIC) }, // 72
|
||||
{ "voicecom/igotone", "I got one!", 0, 0, 0, S_IGOTONE, C(VOICECOM)|C(TEAM) |C(FFA) }, // 72
|
||||
{ "voicecom/imadecontact", "I made contact", 0, 0, 0, S_IMADECONTACT, C(VOICECOM)|C(TEAM) }, // 73
|
||||
{ "voicecom/imattacking", "I'm attacking", 0, 0, 0, S_IMATTACKING, C(VOICECOM)|C(TEAM) }, // 74
|
||||
{ "voicecom/imondefense", "I'm on defense", 0, 0, 0, S_IMONDEFENSE, C(VOICECOM)|C(TEAM) }, // 75
|
||||
@@ -634,7 +634,7 @@ soundcfgitem soundcfg[S_NULL] =
|
||||
{ "voicecom/negative", "Negative", 0, 0, 0, S_NEGATIVE, C(VOICECOM)|C(TEAM) }, // 77
|
||||
{ "voicecom/nocando", "No can do", 0, 0, 0, S_NOCANDO, C(VOICECOM)|C(TEAM) }, // 78
|
||||
{ "voicecom/recovertheflag", "Recover the flag", 0, 0, 0, S_RECOVERTHEFLAG, C(VOICECOM)|C(TEAM) |C(FLAGONLY) }, // 79
|
||||
{ "voicecom/sorry", "Sorry", 0, 0, 0, S_SORRY, C(VOICECOM)|C(TEAM)|C(PUBLIC)|C(FFA) }, // 80
|
||||
{ "voicecom/sorry", "Sorry", 0, 0, 0, S_SORRY, C(VOICECOM)|C(TEAM) |C(FFA) }, // 80
|
||||
{ "voicecom/spreadout", "Spread out", 0, 0, 0, S_SPREADOUT, C(VOICECOM)|C(TEAM) }, // 81
|
||||
{ "voicecom/stayhere", "Stay here", 0, 0, 0, S_STAYHERE, C(VOICECOM)|C(TEAM) }, // 82
|
||||
{ "voicecom/staytogether", "Stay together", 0, 0, 0, S_STAYTOGETHER, C(VOICECOM)|C(TEAM) }, // 83
|
||||
@@ -648,11 +648,11 @@ soundcfgitem soundcfg[S_NULL] =
|
||||
{ "voicecom/inposition_1", "In position", 0, 0, 0, S_INPOSITION1, C(VOICECOM)|C(TEAM) }, // 91
|
||||
{ "voicecom/inposition_2", "In position now", 0, 0, 0, S_INPOSITION2, C(VOICECOM)|C(TEAM) }, // 92
|
||||
{ "voicecom/reportin", "Report in!", 0, 0, 0, S_REPORTIN, C(VOICECOM)|C(TEAM) }, // 93
|
||||
{ "voicecom/niceshot", "Nice shot", 0, 0, 0, S_NICESHOT, C(VOICECOM)|C(TEAM)|C(PUBLIC)|C(FFA) }, // 94
|
||||
{ "voicecom/thanks_1", "Thanks", 0, 0, 0, S_THANKS1, C(VOICECOM)|C(TEAM)|C(PUBLIC)|C(FFA) }, // 95
|
||||
{ "voicecom/thanks_2", "Thanks, man", 0, 0, 0, S_THANKS2, C(VOICECOM)|C(TEAM)|C(PUBLIC)|C(FFA) }, // 96
|
||||
{ "voicecom/awesome_1", "Awesome (1)", 0, 0, 0, S_AWESOME1, C(VOICECOM)|C(TEAM)|C(PUBLIC)|C(FFA) }, // 97
|
||||
{ "voicecom/awesome_2", "Awesome (2)", 0, 0, 0, S_AWESOME2, C(VOICECOM)|C(TEAM)|C(PUBLIC)|C(FFA) }, // 98
|
||||
{ "voicecom/niceshot", "Nice shot", 0, 0, 0, S_NICESHOT, C(VOICECOM)|C(TEAM)|C(PUBLIC) }, // 94
|
||||
{ "voicecom/thanks_1", "Thanks", 0, 0, 0, S_THANKS1, C(VOICECOM)|C(TEAM)|C(PUBLIC) }, // 95
|
||||
{ "voicecom/thanks_2", "Thanks, man", 0, 0, 0, S_THANKS2, C(VOICECOM)|C(TEAM)|C(PUBLIC) }, // 96
|
||||
{ "voicecom/awesome_1", "Awesome (1)", 0, 0, 0, S_AWESOME1, C(VOICECOM)|C(TEAM)|C(PUBLIC) }, // 97
|
||||
{ "voicecom/awesome_2", "Awesome (2)", 0, 0, 0, S_AWESOME2, C(VOICECOM)|C(TEAM)|C(PUBLIC) }, // 98
|
||||
{ "misc/pickup_helmet", "Helmet pickup", 0, 0, 0, S_ITEMHELMET, C(PICKUP) }, // 99
|
||||
{ "player/heartbeat", "Heartbeat", 0, 0, 0, S_HEARTBEAT, C(OWNPAIN) }, // 100
|
||||
{ "ktf/flagscore", "KTF score", 0, 0, 0, S_KTFSCORE, C(OTHER) }, // 101
|
||||
|
||||
@@ -81,6 +81,9 @@ enum { SC_PAIN = 0, SC_OWNPAIN, SC_WEAPON, SC_PICKUP, SC_MOVEMENT, SC_BULLET, SC
|
||||
#define gamesound_hasflag(x, mask) (gamesound_isvalid(x) && (soundcfg[x].flags & mask) != 0)
|
||||
#define gamesound_isvoicecom(x) gamesound_hasflag(x, 1 << SC_VOICECOM) // all voicecoms
|
||||
#define gamesound_ispublicvoicecom(x) gamesound_hasflag(x, 1 << SC_PUBLIC) // voicecoms always sent to all players
|
||||
#define gamesound_ispublicwhenffa(x) gamesound_hasflag(x, 1 << SC_FFA) // voicecoms sent to all only in FFA modes
|
||||
#define gamesound_isflagvoicecom(x) gamesound_hasflag(x, 1 << SC_FLAGONLY) // voicecoms pertaining to flag tactics
|
||||
|
||||
|
||||
struct soundcfgitem {
|
||||
const char *name, *desc;
|
||||
|
||||
Reference in New Issue
Block a user