Version18.124

This commit is contained in:
Antonio Cañas Vargas 2019-05-28 15:06:53 +02:00
parent a4f60d4aaa
commit 930714e7c3
19 changed files with 1211 additions and 520 deletions

View File

@ -622,23 +622,35 @@ CREATE TABLE IF NOT EXISTS gam_answers (
NumUsrs INT NOT NULL DEFAULT 0,
UNIQUE INDEX(GamCod,QstCod,AnsInd));
--
-- Table gam_grp: stores the groups associated to each game
-- Table gam_grp: stores the groups associated to each match in a game
--
CREATE TABLE IF NOT EXISTS gam_grp (
GamCod INT NOT NULL,
MchCod INT NOT NULL,
GrpCod INT NOT NULL,
UNIQUE INDEX(GamCod,GrpCod));
UNIQUE INDEX(MchCod,GrpCod));
--
-- Table gam_playing: stores the games beeing played currently
-- Table gam_matches: stores the matches (games instances) already played
--
CREATE TABLE IF NOT EXISTS gam_matches (
MchCod INT NOT NULL AUTO_INCREMENT,
GamCod INT NOT NULL,
StartTime DATETIME NOT NULL,
EndTime DATETIME NOT NULL,
UsrCod INT NOT NULL,
Title VARCHAR(2047) NOT NULL,
UNIQUE INDEX(MchCod),
INDEX(GamCod));
--
-- Table gam_playing: stores the matches (game instances) beeing played currently
--
CREATE TABLE IF NOT EXISTS gam_playing (
GamCod INT NOT NULL,
MchCod INT NOT NULL,
QstInd INT NOT NULL DEFAULT 0,
QstCod INT NOT NULL DEFAULT -1,
ShowingAnswers ENUM('N','Y') NOT NULL DEFAULT 'N',
GamStart DATETIME NOT NULL,
MchStart DATETIME NOT NULL,
QstStart DATETIME NOT NULL,
UNIQUE INDEX(GamCod));
UNIQUE INDEX(MchCod));
--
-- Table gam_questions: stores the questions in the games
--

View File

@ -4504,7 +4504,6 @@ int swad__getGames (struct soap *soap,
return SOAP_OK;
}
/*****************************************************************************/
/**************** Get lists of groups of an attendance event *****************/
/*****************************************************************************/

View File

@ -605,13 +605,15 @@ Assessment:
453. ActRemSvyQst Confirm the removal of a question of a survey
454. ActSeeGam Show one game
455. ActStrGamTch Start a game (by a teacher)
455. ActFrmNewMch Put form to create a new match (by a teacher)
NEW. ActReqRemMch Request the removal of a match (by a teacher)
NEW. ActRemMch Confirm the removal of a match (by a teacher)
456. ActGamTch1stQst Show first question when playing a game (by a teacher)
457. ActGamTchNxtQst Show next question when playing a game (by a teacher)
458. ActGamTchAns Show answers of current question when playing a game (by a teacher)
NEW. ActGamTchEnd End playing a game (by a teacher)
NEW. ActPlyGamStd Play a game (by a student)
NEW. ActPlyMchStd Play a game (by a student)
NEW. ActGamStdCurQst Show current question when playing a game (by a student)
NEW. ActRefGamStd Refresh current question when playing a game (by a student)
@ -2141,15 +2143,17 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActSeeGam */{1650,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_SeeOneGame ,NULL},
/* ActStrGamTch */{1670,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_StartGameTch ,NULL},
/* ActGamTch1stQst */{1671,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Gam_GameTchFirstQuestion ,NULL},
/* ActGamTchNxtQst */{1672,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_GameTchNextQuestion ,NULL},
/* ActGamTchAns */{1673,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_GameTchShowAnswers ,NULL},
/* ActGamTchEnd */{1781,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_GameTchEnd ,NULL},
/* ActFrmNewMch */{1670,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestNewMatch ,NULL},
/* ActReqRemMch */{1783,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestRemoveMatch ,NULL},
/* ActRemMch */{1784,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RemoveMatch ,NULL},
/* ActGamTch1stQst */{1671,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Gam_CreateAndStartNewMatch ,NULL},
/* ActGamTchNxtQst */{1672,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_MatchTchNextQuestion ,NULL},
/* ActGamTchAns */{1673,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_MatchTchShowAnswers ,NULL},
/* ActGamTchEnd */{1781,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_MatchTchEnd ,NULL},
/* ActPlyGamStd */{1779,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_PlayGameStd ,NULL},
/* ActGamStdCurQst */{1780,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,Gam_GetGameBeingPlayed ,Gam_ShowNewGameToMeAsStd ,NULL},
/* ActRefGamStd */{1782,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Gam_GetGameBeingPlayed ,Gam_RefreshCurrentGameStd ,NULL},
/* ActPlyMchStd */{1779,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_PlayMatchStd ,NULL},
/* ActGamStdCurQst */{1780,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,Gam_GetMatchBeingPlayed ,Gam_ShowNewMatchToMeAsStd ,NULL},
/* ActRefGamStd */{1782,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Gam_GetMatchBeingPlayed ,Gam_RefreshCurrentMatchStd ,NULL},
/* ActAnsGam */{1651,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_ReceiveGameAnswers ,NULL},
/* ActFrmNewGam */{1652,-1,TabUnk,ActSeeAllGam ,0x238,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestCreatOrEditGame ,NULL},
@ -4871,7 +4875,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActAddTstQstToGam, // #1667
ActUp_GamQst, // #1668
ActDwnGamQst, // #1669
ActStrGamTch, // #1670
ActFrmNewMch, // #1670
ActGamTch1stQst, // #1671
ActGamTchNxtQst, // #1672
ActGamTchAns, // #1673
@ -4980,10 +4984,12 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActReqUnlAllPrj, // #1776
ActLckAllPrj, // #1777
ActUnlAllPrj, // #1778
ActPlyGamStd, // #1779
ActPlyMchStd, // #1779
ActGamStdCurQst, // #1780
ActGamTchEnd, // #1781
ActRefGamStd, // #1782
ActReqRemMch, // #1783
ActRemMch, // #1784
};
/*****************************************************************************/

View File

@ -64,9 +64,9 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_NUM_ACTIONS (1 + 4 + 64 + 38 + 12 + 42 + 36 + 19 + 110 + 167 + 437 + 176 + 169 + 16 + 67)
#define Act_NUM_ACTIONS (1 + 4 + 64 + 38 + 12 + 42 + 36 + 19 + 110 + 169 + 437 + 176 + 169 + 16 + 67)
#define Act_MAX_ACTION_COD 1782
#define Act_MAX_ACTION_COD 1784
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@ -607,59 +607,61 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActSeeOneTstResOth (ActChgCrsTT1stDay + 115)
#define ActSeeGam (ActChgCrsTT1stDay + 116)
#define ActStrGamTch (ActChgCrsTT1stDay + 117)
#define ActGamTch1stQst (ActChgCrsTT1stDay + 118)
#define ActGamTchNxtQst (ActChgCrsTT1stDay + 119)
#define ActGamTchEnd (ActChgCrsTT1stDay + 120)
#define ActGamTchAns (ActChgCrsTT1stDay + 121)
#define ActPlyGamStd (ActChgCrsTT1stDay + 122)
#define ActGamStdCurQst (ActChgCrsTT1stDay + 123)
#define ActRefGamStd (ActChgCrsTT1stDay + 124)
#define ActAnsGam (ActChgCrsTT1stDay + 125)
#define ActFrmNewGam (ActChgCrsTT1stDay + 126)
#define ActEdiOneGam (ActChgCrsTT1stDay + 127)
#define ActNewGam (ActChgCrsTT1stDay + 128)
#define ActChgGam (ActChgCrsTT1stDay + 129)
#define ActReqRemGam (ActChgCrsTT1stDay + 130)
#define ActRemGam (ActChgCrsTT1stDay + 131)
#define ActReqRstGam (ActChgCrsTT1stDay + 132)
#define ActRstGam (ActChgCrsTT1stDay + 133)
#define ActHidGam (ActChgCrsTT1stDay + 134)
#define ActShoGam (ActChgCrsTT1stDay + 135)
#define ActAddOneGamQst (ActChgCrsTT1stDay + 136)
#define ActGamLstTstQst (ActChgCrsTT1stDay + 137)
#define ActAddTstQstToGam (ActChgCrsTT1stDay + 138)
#define ActReqRemGamQst (ActChgCrsTT1stDay + 139)
#define ActRemGamQst (ActChgCrsTT1stDay + 140)
#define ActUp_GamQst (ActChgCrsTT1stDay + 141)
#define ActDwnGamQst (ActChgCrsTT1stDay + 142)
#define ActFrmNewMch (ActChgCrsTT1stDay + 117)
#define ActReqRemMch (ActChgCrsTT1stDay + 118)
#define ActRemMch (ActChgCrsTT1stDay + 119)
#define ActGamTch1stQst (ActChgCrsTT1stDay + 120)
#define ActGamTchNxtQst (ActChgCrsTT1stDay + 121)
#define ActGamTchAns (ActChgCrsTT1stDay + 122)
#define ActGamTchEnd (ActChgCrsTT1stDay + 123)
#define ActPlyMchStd (ActChgCrsTT1stDay + 124)
#define ActGamStdCurQst (ActChgCrsTT1stDay + 125)
#define ActRefGamStd (ActChgCrsTT1stDay + 126)
#define ActAnsGam (ActChgCrsTT1stDay + 127)
#define ActFrmNewGam (ActChgCrsTT1stDay + 128)
#define ActEdiOneGam (ActChgCrsTT1stDay + 129)
#define ActNewGam (ActChgCrsTT1stDay + 130)
#define ActChgGam (ActChgCrsTT1stDay + 131)
#define ActReqRemGam (ActChgCrsTT1stDay + 132)
#define ActRemGam (ActChgCrsTT1stDay + 133)
#define ActReqRstGam (ActChgCrsTT1stDay + 134)
#define ActRstGam (ActChgCrsTT1stDay + 135)
#define ActHidGam (ActChgCrsTT1stDay + 136)
#define ActShoGam (ActChgCrsTT1stDay + 137)
#define ActAddOneGamQst (ActChgCrsTT1stDay + 138)
#define ActGamLstTstQst (ActChgCrsTT1stDay + 139)
#define ActAddTstQstToGam (ActChgCrsTT1stDay + 140)
#define ActReqRemGamQst (ActChgCrsTT1stDay + 141)
#define ActRemGamQst (ActChgCrsTT1stDay + 142)
#define ActUp_GamQst (ActChgCrsTT1stDay + 143)
#define ActDwnGamQst (ActChgCrsTT1stDay + 144)
#define ActSeeSvy (ActChgCrsTT1stDay + 143)
#define ActAnsSvy (ActChgCrsTT1stDay + 144)
#define ActFrmNewSvy (ActChgCrsTT1stDay + 145)
#define ActEdiOneSvy (ActChgCrsTT1stDay + 146)
#define ActNewSvy (ActChgCrsTT1stDay + 147)
#define ActChgSvy (ActChgCrsTT1stDay + 148)
#define ActReqRemSvy (ActChgCrsTT1stDay + 149)
#define ActRemSvy (ActChgCrsTT1stDay + 150)
#define ActReqRstSvy (ActChgCrsTT1stDay + 151)
#define ActRstSvy (ActChgCrsTT1stDay + 152)
#define ActHidSvy (ActChgCrsTT1stDay + 153)
#define ActShoSvy (ActChgCrsTT1stDay + 154)
#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 155)
#define ActRcvSvyQst (ActChgCrsTT1stDay + 156)
#define ActReqRemSvyQst (ActChgCrsTT1stDay + 157)
#define ActRemSvyQst (ActChgCrsTT1stDay + 158)
#define ActSeeSvy (ActChgCrsTT1stDay + 145)
#define ActAnsSvy (ActChgCrsTT1stDay + 146)
#define ActFrmNewSvy (ActChgCrsTT1stDay + 147)
#define ActEdiOneSvy (ActChgCrsTT1stDay + 148)
#define ActNewSvy (ActChgCrsTT1stDay + 149)
#define ActChgSvy (ActChgCrsTT1stDay + 150)
#define ActReqRemSvy (ActChgCrsTT1stDay + 151)
#define ActRemSvy (ActChgCrsTT1stDay + 152)
#define ActReqRstSvy (ActChgCrsTT1stDay + 153)
#define ActRstSvy (ActChgCrsTT1stDay + 154)
#define ActHidSvy (ActChgCrsTT1stDay + 155)
#define ActShoSvy (ActChgCrsTT1stDay + 156)
#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 157)
#define ActRcvSvyQst (ActChgCrsTT1stDay + 158)
#define ActReqRemSvyQst (ActChgCrsTT1stDay + 159)
#define ActRemSvyQst (ActChgCrsTT1stDay + 160)
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 159)
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 160)
#define ActEdiExaAnn (ActChgCrsTT1stDay + 161)
#define ActRcvExaAnn (ActChgCrsTT1stDay + 162)
#define ActPrnExaAnn (ActChgCrsTT1stDay + 163)
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 164)
#define ActRemExaAnn (ActChgCrsTT1stDay + 165)
#define ActHidExaAnn (ActChgCrsTT1stDay + 166)
#define ActShoExaAnn (ActChgCrsTT1stDay + 167)
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 161)
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 162)
#define ActEdiExaAnn (ActChgCrsTT1stDay + 163)
#define ActRcvExaAnn (ActChgCrsTT1stDay + 164)
#define ActPrnExaAnn (ActChgCrsTT1stDay + 165)
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 166)
#define ActRemExaAnn (ActChgCrsTT1stDay + 167)
#define ActHidExaAnn (ActChgCrsTT1stDay + 168)
#define ActShoExaAnn (ActChgCrsTT1stDay + 169)
/*****************************************************************************/
/******************************** Files tab **********************************/

View File

@ -1280,7 +1280,7 @@ static void Asg_ShowLstGrpsToEditAssignment (long AsgCod)
NumGrpTyp < Gbl.Crs.Grps.GrpTypes.Num;
NumGrpTyp++)
if (Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps)
Grp_ListGrpsToEditAsgAttSvyGam (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp],
Grp_ListGrpsToEditAsgAttSvyMch (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp],
AsgCod,Grp_ASSIGNMENT);
/***** End table and box *****/

View File

@ -1224,7 +1224,7 @@ static void Att_ShowLstGrpsToEditAttEvent (long AttCod)
NumGrpTyp < Gbl.Crs.Grps.GrpTypes.Num;
NumGrpTyp++)
if (Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps)
Grp_ListGrpsToEditAsgAttSvyGam (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp],
Grp_ListGrpsToEditAsgAttSvyMch (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp],
AttCod,Grp_ATT_EVENT);
/***** End table and box *****/

View File

@ -429,6 +429,9 @@ Lo de mutear anuncios, en principio prefiero hacer una opci
// TODO: Ver cómo recibir un fichero desde el cliente (SWADroid) en gsoap
// TODO: En Actividades, en Juegos, en Encuestas, en Asistencia poner filtros de Pasados (rojo), Actuales (verde), Futuros (azul).
// Pensar si en Agenda se puede poner igual.
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
@ -448,11 +451,22 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 18.123 (2019-05-22)"
#define Log_PLATFORM_VERSION "SWAD 18.124 (2019-05-28)"
#define CSS_FILE "swad18.123.css"
#define JS_FILE "swad18.123.js"
/*
Version 18.123.1: May 22, 2019 Wait icon while a game has not started. (? lines)
Version 18.124: May 28, 2019 Every game can have several matches (game instances). (243400 lines)
4 changes necessary in database:
DROP TABLE gam_played,gam_playing,gam_grp;
CREATE TABLE IF NOT EXISTS gam_matches (MchCod INT NOT NULL AUTO_INCREMENT,GamCod INT NOT NULL,StartTime DATETIME NOT NULL,EndTime DATETIME NOT NULL,UsrCod INT NOT NULL,Title VARCHAR(2047) NOT NULL,UNIQUE INDEX(MchCod),INDEX(GamCod));
CREATE TABLE IF NOT EXISTS gam_playing (MchCod INT NOT NULL,QstInd INT NOT NULL DEFAULT 0,QstCod INT NOT NULL DEFAULT -1,ShowingAnswers ENUM('N','Y') NOT NULL DEFAULT 'N',MchStart DATETIME NOT NULL,QstStart DATETIME NOT NULL,UNIQUE INDEX(MchCod));
CREATE TABLE IF NOT EXISTS gam_grp (MchCod INT NOT NULL,GrpCod INT NOT NULL,UNIQUE INDEX(MchCod,GrpCod));
Version 18.123.2: May 23, 2019 New table with games instances already played. (242829 lines)
1 change necessary in database:
CREATE TABLE IF NOT EXISTS gam_matches (MchCod INT NOT NULL AUTO_INCREMENT,GamCod INT NOT NULL,Start DATETIME NOT NULL,UNIQUE INDEX(GamPlyCod),INDEX(GamCod));
Version 18.123.1: May 22, 2019 Wait icon while a game has not started. (242788 lines)
Copy the following icon to icon public directory:
sudo cp icon/wait.gif /var/www/html/swad/icon/
@ -486,7 +500,7 @@ ALTER TABLE games CHANGE COLUMN Cod CrsCod INT NOT NULL DEFAULT -1,ADD INDEX (Cr
Version 18.121.2: May 17, 2019 Fixed bug in exporting tests. (242700 lines)
Version 18.121.1: May 16, 2019 Fixed bug in renaming of institution. (242697 lines)
Version 18.121: May 13, 2019 Module swad_web_service is renamed as swad_API.
New API function getCourses. (242708 lines)
New API function getGames. (242708 lines)
Version 18.120.2: Apr 30, 2019 Code refactoring related to boxes. (242465 lines)
Version 18.120.1: Apr 25, 2019 Code refactoring related to file browser. (242461 lines)
Version 18.120: Apr 25, 2019 Code refactoring related to file browser. (242466 lines)

View File

@ -1329,7 +1329,7 @@ mysql> DESCRIBE games;
"UsrCod INT NOT NULL,"
"StartTime DATETIME NOT NULL,"
"EndTime DATETIME NOT NULL,"
"Title VARCHAR(2047) NOT NULL," // Gam_MAX_BYTES_SURVEY_TITLE
"Title VARCHAR(2047) NOT NULL," // Gam_MAX_BYTES_TITLE
"Txt TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
"UNIQUE INDEX(GamCod),"
"INDEX(CrsCod))");
@ -1360,15 +1360,40 @@ mysql> DESCRIBE gam_grp;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| GamCod | int(11) | NO | PRI | NULL | |
| MchCod | int(11) | NO | PRI | NULL | |
| GrpCod | int(11) | NO | PRI | NULL | |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_grp ("
"GamCod INT NOT NULL,"
"MchCod INT NOT NULL,"
"GrpCod INT NOT NULL,"
"UNIQUE INDEX(GamCod,GrpCod))");
"UNIQUE INDEX(MchCod,GrpCod))");
/***** Table gam_matches *****/
/*
mysql> DESCRIBE gam_matches;
+-----------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+----------------+
| MchCod | int(11) | NO | PRI | NULL | auto_increment |
| GamCod | int(11) | NO | MUL | NULL | |
| StartTime | datetime | NO | | NULL | |
| EndTime | datetime | NO | | NULL | |
| UsrCod | int(11) | NO | | NULL | |
| Title | varchar(2047) | NO | | NULL | |
+-----------+---------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_matches ("
"MchCod INT NOT NULL AUTO_INCREMENT,"
"GamCod INT NOT NULL,"
"StartTime DATETIME NOT NULL,"
"EndTime DATETIME NOT NULL,"
"UsrCod INT NOT NULL,"
"Title VARCHAR(2047) NOT NULL," // Gam_MAX_BYTES_TITLE
"UNIQUE INDEX(MchCod),"
"INDEX(GamCod)");
/***** Table gam_playing *****/
/*
@ -1376,23 +1401,23 @@ mysql> DESCRIBE gam_playing;
+----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| GamCod | int(11) | NO | PRI | NULL | |
| MchCod | int(11) | NO | PRI | NULL | |
| QstInd | int(11) | NO | | 0 | |
| QstCod | int(11) | NO | | -1 | |
| ShowingAnswers | enum('N','Y') | NO | | N | |
| GamStart | datetime | NO | | NULL | |
| MchStart | datetime | NO | | NULL | |
| QstStart | datetime | NO | | NULL | |
+----------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_playing ("
"GamCod INT NOT NULL,"
"MchCod INT NOT NULL,"
"QstInd INT NOT NULL DEFAULT 0,"
"QstCod INT NOT NULL DEFAULT -1,"
"ShowingAnswers ENUM('N','Y') NOT NULL DEFAULT 'N',"
"GamStart DATETIME NOT NULL,"
"MchStart DATETIME NOT NULL,"
"QstStart DATETIME NOT NULL,"
"UNIQUE INDEX(GamCod))");
"UNIQUE INDEX(MchCod))");
/***** Table gam_questions *****/
/*

File diff suppressed because it is too large Load Diff

View File

@ -33,8 +33,8 @@
/************************** Public types and constants ***********************/
/*****************************************************************************/
#define Gam_MAX_CHARS_SURVEY_TITLE (128 - 1) // 127
#define Gam_MAX_BYTES_SURVEY_TITLE ((Gam_MAX_CHARS_SURVEY_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Gam_MAX_CHARS_TITLE (128 - 1) // 127
#define Gam_MAX_BYTES_TITLE ((Gam_MAX_CHARS_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Gam_NUM_DATES 2
typedef enum
@ -47,7 +47,7 @@ struct Game
{
long GamCod; // Game code
long UsrCod; // Author code
char Title[Gam_MAX_BYTES_SURVEY_TITLE + 1];
char Title[Gam_MAX_BYTES_TITLE + 1];
time_t TimeUTC[Gam_NUM_DATES];
unsigned NumQsts; // Number of questions in the game
unsigned NumUsrs; // Number of distinct users who have already answered the game
@ -55,7 +55,6 @@ struct Game
{
bool Visible; // Game is not hidden
bool Open; // Start date <= now <= end date
bool IBelongToScope; // I belong to the scope of this game
bool IHaveAnswered; // I have already answered this game
bool ICanAnswer;
bool ICanViewResults;
@ -94,6 +93,8 @@ void Gam_FreeListGames (void);
void Gam_PutParamGameCod (long GamCod);
long Gam_GetParamGameCod (void);
void Gam_PutParamMatchCod (long MchCod); // TODO: Check if this function can be static
long Gam_GetParamMatchCod (void); // TODO: Check if this function can be static
void Gam_AskRemGame (void);
void Gam_RemoveGame (void);
void Gam_AskResetGame (void);
@ -101,14 +102,14 @@ void Gam_ResetGame (void);
void Gam_HideGame (void);
void Gam_UnhideGame (void);
void Gam_RecFormGame (void);
bool Gam_CheckIfGamIsAssociatedToGrp (long GamCod,long GrpCod);
bool Gam_CheckIfMatchIsAssociatedToGrp (long MchCod,long GrpCod);
void Gam_RemoveGroup (long GrpCod);
void Gam_RemoveGroupsOfType (long GrpTypCod);
void Gam_RemoveGames (Hie_Level_t Scope,long Cod);
void Gam_RequestNewQuestion (void);
void Gam_GetAndDrawBarNumUsrsWhoAnswered (struct Game *Game,long QstCod,unsigned AnsInd);
void Gam_GetAndDrawBarNumUsrsWhoAnswered (long GamCod,long QstCod,unsigned AnsInd,unsigned NumUsrs);
void Gam_AddTstQuestionsToGame (void);
@ -118,18 +119,21 @@ void Gam_RemoveQst (void);
void Gam_MoveUpQst (void);
void Gam_MoveDownQst (void);
void Gam_StartGameTch (void);
void Gam_PlayGameStd (void);
void Gam_RequestRemoveMatch (void);
void Gam_RemoveMatch (void);
void Gam_RequestNewMatch (void);
void Gam_PlayMatchStd (void);
void Gam_ReceiveGameAnswers (void);
void Gam_GameTchFirstQuestion (void);
void Gam_GameTchNextQuestion (void);
void Gam_GameTchShowAnswers (void);
void Gam_GameTchEnd (void);
void Gam_CreateAndStartNewMatch (void);
void Gam_MatchTchNextQuestion (void);
void Gam_MatchTchShowAnswers (void);
void Gam_MatchTchEnd (void);
void Gam_GetGameBeingPlayed (void);
void Gam_ShowNewGameToMeAsStd (void);
void Gam_RefreshCurrentGameStd (void);
void Gam_GetMatchBeingPlayed (void);
void Gam_ShowNewMatchToMeAsStd (void);
void Gam_RefreshCurrentMatchStd (void);
unsigned Gam_GetNumCoursesWithGames (Hie_Level_t Scope);
unsigned Gam_GetNumGames (Hie_Level_t Scope);

View File

@ -704,7 +704,7 @@ struct Globals
Gam_Order_t SelectedOrder;
unsigned CurrentPage;
char *ListQuestions;
long GamCodBeingPlayed; // Used to refresh game via AJAX
long MchCodBeingPlayed; // Used to refresh game via AJAX
} Games;
struct
{

View File

@ -1700,11 +1700,11 @@ static void Grp_WriteHeadingGroups (void)
}
/*****************************************************************************/
/********* List groups of a type **********/
/********* to edit assignments, attendance events, surveys or games **********/
/******** List groups of a type **********/
/******** to edit assignments, attendance events, surveys or matches *********/
/*****************************************************************************/
void Grp_ListGrpsToEditAsgAttSvyGam (struct GroupType *GrpTyp,long Cod,
void Grp_ListGrpsToEditAsgAttSvyMch (struct GroupType *GrpTyp,long Cod,
Grp_AsgAttSvyGam_t Grp_AsgAttOrSvy)
{
struct ListCodGrps LstGrpsIBelong;
@ -1751,8 +1751,8 @@ void Grp_ListGrpsToEditAsgAttSvyGam (struct GroupType *GrpTyp,long Cod,
case Grp_SURVEY:
AssociatedToGrp = Svy_CheckIfSvyIsAssociatedToGrp (Cod,Grp->GrpCod);
break;
case Grp_GAME:
AssociatedToGrp = Gam_CheckIfGamIsAssociatedToGrp (Cod,Grp->GrpCod);
case Grp_MATCH:
AssociatedToGrp = Gam_CheckIfMatchIsAssociatedToGrp (Cod,Grp->GrpCod);
break;
}
if (AssociatedToGrp)

View File

@ -137,7 +137,7 @@ typedef enum
Grp_ASSIGNMENT,
Grp_ATT_EVENT,
Grp_SURVEY,
Grp_GAME,
Grp_MATCH,
} Grp_AsgAttSvyGam_t;
/*****************************************************************************/
@ -163,7 +163,7 @@ void Grp_RegisterUsrIntoGroups (struct UsrData *UsrDat,struct ListCodGrps *LstGr
unsigned Grp_RemoveUsrFromGroups (struct UsrData *UsrDat,struct ListCodGrps *LstGrps);
void Grp_RemUsrFromAllGrpsInCrs (long UsrCod,long CrsCod);
void Grp_RemUsrFromAllGrps (long UsrCod);
void Grp_ListGrpsToEditAsgAttSvyGam (struct GroupType *GrpTyp,long Cod,
void Grp_ListGrpsToEditAsgAttSvyMch (struct GroupType *GrpTyp,long Cod,
Grp_AsgAttSvyGam_t Grp_AsgOrSvy);
void Grp_ReqRegisterInGrps (void);

View File

@ -1371,17 +1371,17 @@ const char *Hlp_ASSESSMENT_Games_edit_game =
const char *Hlp_ASSESSMENT_Games_new_game =
#if L==1
"ASSESSMENT.Games.es#nueva-juego";
"ASSESSMENT.Games.es#nuevo-juego";
#elif L==2
"ASSESSMENT.Games.en#new-game";
#elif L==3
"ASSESSMENT.Games.en#new-game";
#elif L==4
"ASSESSMENT.Games.es#nueva-juego";
"ASSESSMENT.Games.es#nuevo-juego";
#elif L==5
"ASSESSMENT.Games.en#new-game";
#elif L==6
"ASSESSMENT.Games.es#nueva-juego";
"ASSESSMENT.Games.es#nuevo-juego";
#elif L==7
"ASSESSMENT.Games.en#new-game";
#elif L==8
@ -1411,6 +1411,48 @@ const char *Hlp_ASSESSMENT_Games_edit_juego =
"ASSESSMENT.Games.en#edit-juego";
#endif
const char *Hlp_ASSESSMENT_Games_matches =
#if L==1
"ASSESSMENT.Games.es#partidas";
#elif L==2
"ASSESSMENT.Games.en#matches";
#elif L==3
"ASSESSMENT.Games.en#matches";
#elif L==4
"ASSESSMENT.Games.es#partidas";
#elif L==5
"ASSESSMENT.Games.en#matches";
#elif L==6
"ASSESSMENT.Games.es#partidas";
#elif L==7
"ASSESSMENT.Games.en#matches";
#elif L==8
"ASSESSMENT.Games.en#matches";
#elif L==9
"ASSESSMENT.Games.en#matches";
#endif
const char *Hlp_ASSESSMENT_Games_new_match =
#if L==1
"ASSESSMENT.Games.es#nueva-partida";
#elif L==2
"ASSESSMENT.Games.en#new-match";
#elif L==3
"ASSESSMENT.Games.en#new-match";
#elif L==4
"ASSESSMENT.Games.es#nueva-partida";
#elif L==5
"ASSESSMENT.Games.en#new-match";
#elif L==6
"ASSESSMENT.Games.es#nueva-partida";
#elif L==7
"ASSESSMENT.Games.en#new-match";
#elif L==8
"ASSESSMENT.Games.en#new-match";
#elif L==9
"ASSESSMENT.Games.en#new-match";
#endif
const char *Hlp_ASSESSMENT_Games_questions =
#if L==1
"ASSESSMENT.Games.es#preguntas";

View File

@ -794,7 +794,7 @@ static void Lay_WriteScriptParamsAJAX (void)
fprintf (Gbl.F.Out,"var RefreshParamNxtActGam = \"act=%ld\";\n"
"var RefreshParamGamCod = \"GamCod=%ld\";\n",
Act_GetActCod (ActRefGamStd),
Gbl.Games.GamCodBeingPlayed);
Gbl.Games.MchCodBeingPlayed);
break;
/* Parameter related with clicks refreshing */
case ActLstClk:

View File

@ -2050,7 +2050,7 @@ static void Svy_ShowLstGrpsToEditSurvey (long SvyCod)
NumGrpTyp < Gbl.Crs.Grps.GrpTypes.Num;
NumGrpTyp++)
if (Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps)
Grp_ListGrpsToEditAsgAttSvyGam (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp],
Grp_ListGrpsToEditAsgAttSvyMch (&Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp],
SvyCod,Grp_SURVEY);
/***** End table and box *****/

View File

@ -157,8 +157,7 @@ static void Tst_ShowTestQuestionsWhenSeeing (MYSQL_RES *mysql_res);
static void Tst_ShowTestResultAfterAssess (long TstCod,unsigned *NumQstsNotBlank,double *TotalScore);
static void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestions,
struct UsrData *UsrDat,
struct Game *Game,
unsigned NumQst,long QstCod,MYSQL_ROW row,
long GamCod,unsigned NumQst,long QstCod,MYSQL_ROW row,
double *ScoreThisQst,bool *AnswerIsNotBlank);
static void Tst_PutFormToEditQstMedia (struct Media *Media,int NumMediaInForm,
bool OptionsDisabled);
@ -210,8 +209,7 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
unsigned NumQst,MYSQL_RES *mysql_res,
double *ScoreThisQst,bool *AnswerIsNotBlank);
static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
unsigned NumQst,long QstCod,
static void Tst_WriteChoiceAnsViewGame (long GamCod,unsigned NumQst,long QstCod,
const char *Class,
bool ShowResult);
@ -866,7 +864,7 @@ static void Tst_ShowTestQuestionsWhenSeeing (MYSQL_RES *mysql_res)
Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_TO_ANSWER,
&Gbl.Usrs.Me.UsrDat,
NULL,NumQst,QstCod,row,
-1L,NumQst,QstCod,row,
&ScoreThisQst, // Not used here
&AnswerIsNotBlank); // Not used here
}
@ -968,7 +966,7 @@ static void Tst_ShowTestResultAfterAssess (long TstCod,unsigned *NumQstsNotBlank
/***** Write question and answers *****/
Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_RESULT,
&Gbl.Usrs.Me.UsrDat,
NULL,NumQst,QstCod,row,
-1L,NumQst,QstCod,row,
&ScoreThisQst,&AnswerIsNotBlank);
/***** Store test result question in database *****/
@ -1009,8 +1007,7 @@ static void Tst_ShowTestResultAfterAssess (long TstCod,unsigned *NumQstsNotBlank
static void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestions,
struct UsrData *UsrDat,
struct Game *Game,
unsigned NumQst,long QstCod,MYSQL_ROW row,
long GamCod,unsigned NumQst,long QstCod,MYSQL_ROW row,
double *ScoreThisQst,bool *AnswerIsNotBlank)
{
extern const char *Txt_TST_STR_ANSWER_TYPES[Tst_NUM_ANS_TYPES];
@ -1074,11 +1071,11 @@ static void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWith
case Tst_SELECT_QUESTIONS_FOR_GAME:
break;
case Tst_SHOW_GAME_TO_ANSWER:
Tst_WriteAnswersGameResult (Game,NumQst,QstCod,
Tst_WriteAnswersGameResult (GamCod,NumQst,QstCod,
"GAM_PLAY_QST",false); // Don't show result
break;
case Tst_SHOW_GAME_RESULT:
Tst_WriteAnswersGameResult (Game,NumQst,QstCod,
Tst_WriteAnswersGameResult (GamCod,NumQst,QstCod,
"GAM_PLAY_QST",true); // Show result
break;
}
@ -3528,12 +3525,12 @@ static void Tst_WriteAnswersTestResult (struct UsrData *UsrDat,
/************** Write answers of a question when viewing a game **************/
/*****************************************************************************/
void Tst_WriteAnswersGameResult (struct Game *Game,unsigned NumQst,long QstCod,
void Tst_WriteAnswersGameResult (long GamCod,unsigned NumQst,long QstCod,
const char *Class,bool ShowResult)
{
/***** Write answer depending on type *****/
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE)
Tst_WriteChoiceAnsViewGame (Game,NumQst,QstCod,
Tst_WriteChoiceAnsViewGame (GamCod,NumQst,QstCod,
Class,ShowResult);
else
Ale_ShowAlert (Ale_ERROR,"Type of answer not valid in a game.");
@ -4047,8 +4044,7 @@ static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
/******** Write single or multiple choice answer when viewing a test *********/
/*****************************************************************************/
static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
unsigned NumQst,long QstCod,
static void Tst_WriteChoiceAnsViewGame (long GamCod,unsigned NumQst,long QstCod,
const char *Class,
bool ShowResult)
{
@ -4146,7 +4142,8 @@ static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
"<td class=\"DAT LEFT_TOP\">");
/* Get number of users who selected this answer
and draw proportional bar */
Gam_GetAndDrawBarNumUsrsWhoAnswered (Game,QstCod,AnsInd);
Gam_GetAndDrawBarNumUsrsWhoAnswered (GamCod,QstCod,AnsInd,
0); // TODO: NumUsrs
fprintf (Gbl.F.Out,"</td>"
"</tr>");
}
@ -8264,7 +8261,7 @@ static void Tst_ShowTestResult (time_t TstTimeUTC)
/***** Write questions and answers *****/
Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_RESULT,
&Gbl.Usrs.Other.UsrDat,
NULL,NumQst,QstCod,row,
-1L,NumQst,QstCod,row,
&ScoreThisQst, // Not used here
&AnswerIsNotBlank); // Not used here
}

View File

@ -154,7 +154,7 @@ bool Tst_GetOneQuestionByCod (long QstCod,MYSQL_RES **mysql_res);
void Tst_WriteParamEditQst (void);
unsigned Tst_GetNumAnswersQst (long QstCod);
unsigned Tst_GetAnswersQst (long QstCod,MYSQL_RES **mysql_res,bool Shuffle);
void Tst_WriteAnswersGameResult (struct Game *Game,unsigned NumQst,long QstCod,
void Tst_WriteAnswersGameResult (long GamCod,unsigned NumQst,long QstCod,
const char *Class,bool ShowResult);
bool Tst_CheckIfQuestionIsValidForGame (long QstCod);
void Tst_WriteAnsTF (char AnsTF);

View File

@ -8889,6 +8889,27 @@ const char *Txt_Do_you_really_want_to_remove_the_group_X_Y_students_ = // Warnin
"Ao fazer isso, voc&ecirc; remover&aacute; %u estudantes desse grupo.";
#endif
const char *Txt_Do_you_really_want_to_remove_the_match_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"De veres voleu eliminar la partida <strong>%s</strong>?";
#elif L==2 // de
"Wollen Sie die Spiel <strong>%s</strong> wirklich entfernen?";
#elif L==3 // en
"Do you really want to remove the match <strong>%s</strong>?";
#elif L==4 // es
"&iquest;Realmente desea eliminar la partida <strong>%s</strong>?";
#elif L==5 // fr
"Voulez-vous vraiment supprimer le match <strong>%s</strong>?";
#elif L==6 // gn
"&iquest;Realmente desea eliminar la partida <strong>%s</strong>?"; // Okoteve traducción
#elif L==7 // it
"Vuoi realmente rimuovere la partita <strong>%s</strong>?";
#elif L==8 // pl
"Czy na pewno chcesz usunac mecz <strong>%s</strong>?";
#elif L==9 // pt
"Voc&ecirc; realmente deseja remover o jogo <strong>%s</strong>?";
#endif
const char *Txt_Do_you_really_want_to_remove_the_photo_of_X = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"De veres voleu eliminar la foto de <strong>%s</strong>?";
@ -17812,9 +17833,72 @@ const char *Txt_Marks_area =
"Zona de notas";
#endif
const char *Txt_Match = // of a game
#if L==1 // ca
"Partida";
#elif L==2 // de
"Spiel";
#elif L==3 // en
"Match";
#elif L==4 // es
"Partida";
#elif L==5 // fr
"Match";
#elif L==6 // gn
"Partida"; // Okoteve traducción
#elif L==7 // it
"Partita";
#elif L==8 // pl
"Mecz";
#elif L==9 // pt
"Jogo";
#endif
const char *Txt_Match_X_removed = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"Partida <strong>%s</strong> eliminada.";
#elif L==2 // de
"Spiel <strong>%s</strong> entfernt.";
#elif L==3 // en
"Match <strong>%s</strong> removed.";
#elif L==4 // es
"Partida <strong>%s</strong> eliminada.";
#elif L==5 // fr
"Match <strong>%s</strong> supprim&eacute;.";
#elif L==6 // gn
"Partida <strong>%s</strong> eliminada."; // Okoteve traducción
#elif L==7 // it
"Partita <strong>%s</strong> rimossa.";
#elif L==8 // pl
"Mecz <strong>%s</strong> usuni&eogon;te.";
#elif L==9 // pt
"Jogo <strong>%s</strong> removido.";
#endif
const char *Txt_Matches = // of a game
#if L==1 // ca
"Partides";
#elif L==2 // de
"Spiele";
#elif L==3 // en
"Matches";
#elif L==4 // es
"Partidas";
#elif L==5 // fr
"Matchs";
#elif L==6 // gn
"Partidas"; // Okoteve traducción
#elif L==7 // it
"Partite";
#elif L==8 // pl
"Mecze";
#elif L==9 // pt
"Jogos";
#endif
const char *Txt_Materials =
#if L==1 // ca
"Materiales"; // Necessita traduccio
"Materials";
#elif L==2 // de
"Material";
#elif L==3 // en
@ -23779,6 +23863,27 @@ const char *Txt_New_link =
"Nova liga&ccedil;&atilde;o";
#endif
const char *Txt_New_match = // of a game
#if L==1 // ca
"Nova partida";
#elif L==2 // de
"Neues Spiel";
#elif L==3 // en
"New match";
#elif L==4 // es
"Nueva partida";
#elif L==5 // fr
"Nouveau match";
#elif L==6 // gn
"Nueva partida"; // Okoteve traducción
#elif L==7 // it
"Nuova partita";
#elif L==8 // pl
"Nowy mecz";
#elif L==9 // pt
"Novo jogo";
#endif
const char *Txt_New_message =
#if L==1 // ca
"Nou missatge";
@ -32034,6 +32139,27 @@ const char *Txt_Remove_logo =
"Remover logotipo";
#endif
const char *Txt_Remove_match = // of a game
#if L==1 // ca
"Eliminar partida";
#elif L==2 // de
"Entfernen Spiel";
#elif L==3 // en
"Remove match";
#elif L==4 // es
"Eliminar partida";
#elif L==5 // fr
"Supprimer match";
#elif L==6 // gn
"Eliminar partida"; // Okoteve traducción
#elif L==7 // it
"Rimuovere partita";
#elif L==8 // pl
"Usu&nacute; mecz";
#elif L==9 // pt
"Remover jogo";
#endif
const char *Txt_Remove_me =
#if L==1 // ca
"Eliminarme";
@ -40896,23 +41022,23 @@ const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES] =
#endif
};
const char *Txt_Start_game =
const char *Txt_Start_match =
#if L==1 // ca
"Comen&ccedil;ar joc";
"Comen&ccedil;ar partida";
#elif L==2 // de
"Spiel starten";
#elif L==3 // en
"Start game";
"Start match";
#elif L==4 // es
"Comenzar juego";
"Comenzar partida";
#elif L==5 // fr
"Commencer le jeu";
"Commencer le match";
#elif L==6 // gn
"&Ntilde;epyr&utilde; &ntilde;embosar&aacute;i";
#elif L==7 // it
"Inizia il gioco";
"Inizia la partita";
#elif L==8 // pl
"Rozpocznij gr&eogon;";
"Rozpocznij mecz";
#elif L==9 // pt
"Come&ccedil;ar o jogo";
#endif