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, NumUsrs INT NOT NULL DEFAULT 0,
UNIQUE INDEX(GamCod,QstCod,AnsInd)); 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 ( CREATE TABLE IF NOT EXISTS gam_grp (
GamCod INT NOT NULL, MchCod INT NOT NULL,
GrpCod 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 ( CREATE TABLE IF NOT EXISTS gam_playing (
GamCod INT NOT NULL, MchCod INT NOT NULL,
QstInd INT NOT NULL DEFAULT 0, QstInd INT NOT NULL DEFAULT 0,
QstCod INT NOT NULL DEFAULT -1, QstCod INT NOT NULL DEFAULT -1,
ShowingAnswers ENUM('N','Y') NOT NULL DEFAULT 'N', ShowingAnswers ENUM('N','Y') NOT NULL DEFAULT 'N',
GamStart DATETIME NOT NULL, MchStart DATETIME NOT NULL,
QstStart DATETIME NOT NULL, QstStart DATETIME NOT NULL,
UNIQUE INDEX(GamCod)); UNIQUE INDEX(MchCod));
-- --
-- Table gam_questions: stores the questions in the games -- Table gam_questions: stores the questions in the games
-- --

View File

@ -4504,7 +4504,6 @@ int swad__getGames (struct soap *soap,
return SOAP_OK; return SOAP_OK;
} }
/*****************************************************************************/ /*****************************************************************************/
/**************** Get lists of groups of an attendance event *****************/ /**************** 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 453. ActRemSvyQst Confirm the removal of a question of a survey
454. ActSeeGam Show one game 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) 456. ActGamTch1stQst Show first question when playing a game (by a teacher)
457. ActGamTchNxtQst Show next 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) 458. ActGamTchAns Show answers of current question when playing a game (by a teacher)
NEW. ActGamTchEnd End 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. ActGamStdCurQst Show current question when playing a game (by a student)
NEW. ActRefGamStd Refresh 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}, /* 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}, /* ActFrmNewMch */{1670,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestNewMatch ,NULL},
/* ActGamTch1stQst */{1671,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Gam_GameTchFirstQuestion ,NULL}, /* ActReqRemMch */{1783,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RequestRemoveMatch ,NULL},
/* ActGamTchNxtQst */{1672,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_GameTchNextQuestion ,NULL}, /* ActRemMch */{1784,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Gam_RemoveMatch ,NULL},
/* ActGamTchAns */{1673,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_GameTchShowAnswers ,NULL}, /* ActGamTch1stQst */{1671,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,NULL ,Gam_CreateAndStartNewMatch ,NULL},
/* ActGamTchEnd */{1781,-1,TabUnk,ActSeeAllGam ,0x230,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,NULL ,Gam_GameTchEnd ,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}, /* 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_GetGameBeingPlayed ,Gam_ShowNewGameToMeAsStd ,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_GetGameBeingPlayed ,Gam_RefreshCurrentGameStd ,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}, /* 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}, /* 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 ActAddTstQstToGam, // #1667
ActUp_GamQst, // #1668 ActUp_GamQst, // #1668
ActDwnGamQst, // #1669 ActDwnGamQst, // #1669
ActStrGamTch, // #1670 ActFrmNewMch, // #1670
ActGamTch1stQst, // #1671 ActGamTch1stQst, // #1671
ActGamTchNxtQst, // #1672 ActGamTchNxtQst, // #1672
ActGamTchAns, // #1673 ActGamTchAns, // #1673
@ -4980,10 +4984,12 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActReqUnlAllPrj, // #1776 ActReqUnlAllPrj, // #1776
ActLckAllPrj, // #1777 ActLckAllPrj, // #1777
ActUnlAllPrj, // #1778 ActUnlAllPrj, // #1778
ActPlyGamStd, // #1779 ActPlyMchStd, // #1779
ActGamStdCurQst, // #1780 ActGamStdCurQst, // #1780
ActGamTchEnd, // #1781 ActGamTchEnd, // #1781
ActRefGamStd, // #1782 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 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 #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 ActSeeOneTstResOth (ActChgCrsTT1stDay + 115)
#define ActSeeGam (ActChgCrsTT1stDay + 116) #define ActSeeGam (ActChgCrsTT1stDay + 116)
#define ActStrGamTch (ActChgCrsTT1stDay + 117) #define ActFrmNewMch (ActChgCrsTT1stDay + 117)
#define ActGamTch1stQst (ActChgCrsTT1stDay + 118) #define ActReqRemMch (ActChgCrsTT1stDay + 118)
#define ActGamTchNxtQst (ActChgCrsTT1stDay + 119) #define ActRemMch (ActChgCrsTT1stDay + 119)
#define ActGamTchEnd (ActChgCrsTT1stDay + 120) #define ActGamTch1stQst (ActChgCrsTT1stDay + 120)
#define ActGamTchAns (ActChgCrsTT1stDay + 121) #define ActGamTchNxtQst (ActChgCrsTT1stDay + 121)
#define ActPlyGamStd (ActChgCrsTT1stDay + 122) #define ActGamTchAns (ActChgCrsTT1stDay + 122)
#define ActGamStdCurQst (ActChgCrsTT1stDay + 123) #define ActGamTchEnd (ActChgCrsTT1stDay + 123)
#define ActRefGamStd (ActChgCrsTT1stDay + 124) #define ActPlyMchStd (ActChgCrsTT1stDay + 124)
#define ActAnsGam (ActChgCrsTT1stDay + 125) #define ActGamStdCurQst (ActChgCrsTT1stDay + 125)
#define ActFrmNewGam (ActChgCrsTT1stDay + 126) #define ActRefGamStd (ActChgCrsTT1stDay + 126)
#define ActEdiOneGam (ActChgCrsTT1stDay + 127) #define ActAnsGam (ActChgCrsTT1stDay + 127)
#define ActNewGam (ActChgCrsTT1stDay + 128) #define ActFrmNewGam (ActChgCrsTT1stDay + 128)
#define ActChgGam (ActChgCrsTT1stDay + 129) #define ActEdiOneGam (ActChgCrsTT1stDay + 129)
#define ActReqRemGam (ActChgCrsTT1stDay + 130) #define ActNewGam (ActChgCrsTT1stDay + 130)
#define ActRemGam (ActChgCrsTT1stDay + 131) #define ActChgGam (ActChgCrsTT1stDay + 131)
#define ActReqRstGam (ActChgCrsTT1stDay + 132) #define ActReqRemGam (ActChgCrsTT1stDay + 132)
#define ActRstGam (ActChgCrsTT1stDay + 133) #define ActRemGam (ActChgCrsTT1stDay + 133)
#define ActHidGam (ActChgCrsTT1stDay + 134) #define ActReqRstGam (ActChgCrsTT1stDay + 134)
#define ActShoGam (ActChgCrsTT1stDay + 135) #define ActRstGam (ActChgCrsTT1stDay + 135)
#define ActAddOneGamQst (ActChgCrsTT1stDay + 136) #define ActHidGam (ActChgCrsTT1stDay + 136)
#define ActGamLstTstQst (ActChgCrsTT1stDay + 137) #define ActShoGam (ActChgCrsTT1stDay + 137)
#define ActAddTstQstToGam (ActChgCrsTT1stDay + 138) #define ActAddOneGamQst (ActChgCrsTT1stDay + 138)
#define ActReqRemGamQst (ActChgCrsTT1stDay + 139) #define ActGamLstTstQst (ActChgCrsTT1stDay + 139)
#define ActRemGamQst (ActChgCrsTT1stDay + 140) #define ActAddTstQstToGam (ActChgCrsTT1stDay + 140)
#define ActUp_GamQst (ActChgCrsTT1stDay + 141) #define ActReqRemGamQst (ActChgCrsTT1stDay + 141)
#define ActDwnGamQst (ActChgCrsTT1stDay + 142) #define ActRemGamQst (ActChgCrsTT1stDay + 142)
#define ActUp_GamQst (ActChgCrsTT1stDay + 143)
#define ActDwnGamQst (ActChgCrsTT1stDay + 144)
#define ActSeeSvy (ActChgCrsTT1stDay + 143) #define ActSeeSvy (ActChgCrsTT1stDay + 145)
#define ActAnsSvy (ActChgCrsTT1stDay + 144) #define ActAnsSvy (ActChgCrsTT1stDay + 146)
#define ActFrmNewSvy (ActChgCrsTT1stDay + 145) #define ActFrmNewSvy (ActChgCrsTT1stDay + 147)
#define ActEdiOneSvy (ActChgCrsTT1stDay + 146) #define ActEdiOneSvy (ActChgCrsTT1stDay + 148)
#define ActNewSvy (ActChgCrsTT1stDay + 147) #define ActNewSvy (ActChgCrsTT1stDay + 149)
#define ActChgSvy (ActChgCrsTT1stDay + 148) #define ActChgSvy (ActChgCrsTT1stDay + 150)
#define ActReqRemSvy (ActChgCrsTT1stDay + 149) #define ActReqRemSvy (ActChgCrsTT1stDay + 151)
#define ActRemSvy (ActChgCrsTT1stDay + 150) #define ActRemSvy (ActChgCrsTT1stDay + 152)
#define ActReqRstSvy (ActChgCrsTT1stDay + 151) #define ActReqRstSvy (ActChgCrsTT1stDay + 153)
#define ActRstSvy (ActChgCrsTT1stDay + 152) #define ActRstSvy (ActChgCrsTT1stDay + 154)
#define ActHidSvy (ActChgCrsTT1stDay + 153) #define ActHidSvy (ActChgCrsTT1stDay + 155)
#define ActShoSvy (ActChgCrsTT1stDay + 154) #define ActShoSvy (ActChgCrsTT1stDay + 156)
#define ActEdiOneSvyQst (ActChgCrsTT1stDay + 155) #define ActEdiOneSvyQst (ActChgCrsTT1stDay + 157)
#define ActRcvSvyQst (ActChgCrsTT1stDay + 156) #define ActRcvSvyQst (ActChgCrsTT1stDay + 158)
#define ActReqRemSvyQst (ActChgCrsTT1stDay + 157) #define ActReqRemSvyQst (ActChgCrsTT1stDay + 159)
#define ActRemSvyQst (ActChgCrsTT1stDay + 158) #define ActRemSvyQst (ActChgCrsTT1stDay + 160)
#define ActSeeOneExaAnn (ActChgCrsTT1stDay + 159) #define ActSeeOneExaAnn (ActChgCrsTT1stDay + 161)
#define ActSeeDatExaAnn (ActChgCrsTT1stDay + 160) #define ActSeeDatExaAnn (ActChgCrsTT1stDay + 162)
#define ActEdiExaAnn (ActChgCrsTT1stDay + 161) #define ActEdiExaAnn (ActChgCrsTT1stDay + 163)
#define ActRcvExaAnn (ActChgCrsTT1stDay + 162) #define ActRcvExaAnn (ActChgCrsTT1stDay + 164)
#define ActPrnExaAnn (ActChgCrsTT1stDay + 163) #define ActPrnExaAnn (ActChgCrsTT1stDay + 165)
#define ActReqRemExaAnn (ActChgCrsTT1stDay + 164) #define ActReqRemExaAnn (ActChgCrsTT1stDay + 166)
#define ActRemExaAnn (ActChgCrsTT1stDay + 165) #define ActRemExaAnn (ActChgCrsTT1stDay + 167)
#define ActHidExaAnn (ActChgCrsTT1stDay + 166) #define ActHidExaAnn (ActChgCrsTT1stDay + 168)
#define ActShoExaAnn (ActChgCrsTT1stDay + 167) #define ActShoExaAnn (ActChgCrsTT1stDay + 169)
/*****************************************************************************/ /*****************************************************************************/
/******************************** Files tab **********************************/ /******************************** Files tab **********************************/

View File

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

View File

@ -1224,7 +1224,7 @@ static void Att_ShowLstGrpsToEditAttEvent (long AttCod)
NumGrpTyp < Gbl.Crs.Grps.GrpTypes.Num; NumGrpTyp < Gbl.Crs.Grps.GrpTypes.Num;
NumGrpTyp++) NumGrpTyp++)
if (Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps) 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); AttCod,Grp_ATT_EVENT);
/***** End table and box *****/ /***** 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: 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 *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
@ -448,11 +451,22 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf 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 CSS_FILE "swad18.123.css"
#define JS_FILE "swad18.123.js" #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: Copy the following icon to icon public directory:
sudo cp icon/wait.gif /var/www/html/swad/icon/ 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.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.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. 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.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.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) 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," "UsrCod INT NOT NULL,"
"StartTime DATETIME NOT NULL," "StartTime DATETIME NOT NULL,"
"EndTime 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 "Txt TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
"UNIQUE INDEX(GamCod)," "UNIQUE INDEX(GamCod),"
"INDEX(CrsCod))"); "INDEX(CrsCod))");
@ -1360,15 +1360,40 @@ mysql> DESCRIBE gam_grp;
+--------+---------+------+-----+---------+-------+ +--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+ +--------+---------+------+-----+---------+-------+
| GamCod | int(11) | NO | PRI | NULL | | | MchCod | int(11) | NO | PRI | NULL | |
| GrpCod | int(11) | NO | PRI | NULL | | | GrpCod | int(11) | NO | PRI | NULL | |
+--------+---------+------+-----+---------+-------+ +--------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec) 2 rows in set (0.01 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_grp (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_grp ("
"GamCod INT NOT NULL," "MchCod INT NOT NULL,"
"GrpCod 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 *****/ /***** Table gam_playing *****/
/* /*
@ -1376,23 +1401,23 @@ mysql> DESCRIBE gam_playing;
+----------------+---------------+------+-----+---------+-------+ +----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+ +----------------+---------------+------+-----+---------+-------+
| GamCod | int(11) | NO | PRI | NULL | | | MchCod | int(11) | NO | PRI | NULL | |
| QstInd | int(11) | NO | | 0 | | | QstInd | int(11) | NO | | 0 | |
| QstCod | int(11) | NO | | -1 | | | QstCod | int(11) | NO | | -1 | |
| ShowingAnswers | enum('N','Y') | NO | | N | | | ShowingAnswers | enum('N','Y') | NO | | N | |
| GamStart | datetime | NO | | NULL | | | MchStart | datetime | NO | | NULL | |
| QstStart | datetime | NO | | NULL | | | QstStart | datetime | NO | | NULL | |
+----------------+---------------+------+-----+---------+-------+ +----------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec) 6 rows in set (0.00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_playing (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS gam_playing ("
"GamCod INT NOT NULL," "MchCod INT NOT NULL,"
"QstInd INT NOT NULL DEFAULT 0," "QstInd INT NOT NULL DEFAULT 0,"
"QstCod INT NOT NULL DEFAULT -1," "QstCod INT NOT NULL DEFAULT -1,"
"ShowingAnswers ENUM('N','Y') NOT NULL DEFAULT 'N'," "ShowingAnswers ENUM('N','Y') NOT NULL DEFAULT 'N',"
"GamStart DATETIME NOT NULL," "MchStart DATETIME NOT NULL,"
"QstStart DATETIME NOT NULL," "QstStart DATETIME NOT NULL,"
"UNIQUE INDEX(GamCod))"); "UNIQUE INDEX(MchCod))");
/***** Table gam_questions *****/ /***** Table gam_questions *****/
/* /*

File diff suppressed because it is too large Load Diff

View File

@ -33,8 +33,8 @@
/************************** Public types and constants ***********************/ /************************** Public types and constants ***********************/
/*****************************************************************************/ /*****************************************************************************/
#define Gam_MAX_CHARS_SURVEY_TITLE (128 - 1) // 127 #define Gam_MAX_CHARS_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_BYTES_TITLE ((Gam_MAX_CHARS_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Gam_NUM_DATES 2 #define Gam_NUM_DATES 2
typedef enum typedef enum
@ -47,7 +47,7 @@ struct Game
{ {
long GamCod; // Game code long GamCod; // Game code
long UsrCod; // Author 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]; time_t TimeUTC[Gam_NUM_DATES];
unsigned NumQsts; // Number of questions in the game unsigned NumQsts; // Number of questions in the game
unsigned NumUsrs; // Number of distinct users who have already answered 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 Visible; // Game is not hidden
bool Open; // Start date <= now <= end date 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 IHaveAnswered; // I have already answered this game
bool ICanAnswer; bool ICanAnswer;
bool ICanViewResults; bool ICanViewResults;
@ -94,6 +93,8 @@ void Gam_FreeListGames (void);
void Gam_PutParamGameCod (long GamCod); void Gam_PutParamGameCod (long GamCod);
long Gam_GetParamGameCod (void); 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_AskRemGame (void);
void Gam_RemoveGame (void); void Gam_RemoveGame (void);
void Gam_AskResetGame (void); void Gam_AskResetGame (void);
@ -101,14 +102,14 @@ void Gam_ResetGame (void);
void Gam_HideGame (void); void Gam_HideGame (void);
void Gam_UnhideGame (void); void Gam_UnhideGame (void);
void Gam_RecFormGame (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_RemoveGroup (long GrpCod);
void Gam_RemoveGroupsOfType (long GrpTypCod); void Gam_RemoveGroupsOfType (long GrpTypCod);
void Gam_RemoveGames (Hie_Level_t Scope,long Cod); void Gam_RemoveGames (Hie_Level_t Scope,long Cod);
void Gam_RequestNewQuestion (void); 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); void Gam_AddTstQuestionsToGame (void);
@ -118,18 +119,21 @@ void Gam_RemoveQst (void);
void Gam_MoveUpQst (void); void Gam_MoveUpQst (void);
void Gam_MoveDownQst (void); void Gam_MoveDownQst (void);
void Gam_StartGameTch (void); void Gam_RequestRemoveMatch (void);
void Gam_PlayGameStd (void); void Gam_RemoveMatch (void);
void Gam_RequestNewMatch (void);
void Gam_PlayMatchStd (void);
void Gam_ReceiveGameAnswers (void); void Gam_ReceiveGameAnswers (void);
void Gam_GameTchFirstQuestion (void); void Gam_CreateAndStartNewMatch (void);
void Gam_GameTchNextQuestion (void); void Gam_MatchTchNextQuestion (void);
void Gam_GameTchShowAnswers (void); void Gam_MatchTchShowAnswers (void);
void Gam_GameTchEnd (void); void Gam_MatchTchEnd (void);
void Gam_GetGameBeingPlayed (void); void Gam_GetMatchBeingPlayed (void);
void Gam_ShowNewGameToMeAsStd (void); void Gam_ShowNewMatchToMeAsStd (void);
void Gam_RefreshCurrentGameStd (void); void Gam_RefreshCurrentMatchStd (void);
unsigned Gam_GetNumCoursesWithGames (Hie_Level_t Scope); unsigned Gam_GetNumCoursesWithGames (Hie_Level_t Scope);
unsigned Gam_GetNumGames (Hie_Level_t Scope); unsigned Gam_GetNumGames (Hie_Level_t Scope);

View File

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

View File

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

View File

@ -137,7 +137,7 @@ typedef enum
Grp_ASSIGNMENT, Grp_ASSIGNMENT,
Grp_ATT_EVENT, Grp_ATT_EVENT,
Grp_SURVEY, Grp_SURVEY,
Grp_GAME, Grp_MATCH,
} Grp_AsgAttSvyGam_t; } 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); unsigned Grp_RemoveUsrFromGroups (struct UsrData *UsrDat,struct ListCodGrps *LstGrps);
void Grp_RemUsrFromAllGrpsInCrs (long UsrCod,long CrsCod); void Grp_RemUsrFromAllGrpsInCrs (long UsrCod,long CrsCod);
void Grp_RemUsrFromAllGrps (long UsrCod); 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); Grp_AsgAttSvyGam_t Grp_AsgOrSvy);
void Grp_ReqRegisterInGrps (void); void Grp_ReqRegisterInGrps (void);

View File

@ -1371,17 +1371,17 @@ const char *Hlp_ASSESSMENT_Games_edit_game =
const char *Hlp_ASSESSMENT_Games_new_game = const char *Hlp_ASSESSMENT_Games_new_game =
#if L==1 #if L==1
"ASSESSMENT.Games.es#nueva-juego"; "ASSESSMENT.Games.es#nuevo-juego";
#elif L==2 #elif L==2
"ASSESSMENT.Games.en#new-game"; "ASSESSMENT.Games.en#new-game";
#elif L==3 #elif L==3
"ASSESSMENT.Games.en#new-game"; "ASSESSMENT.Games.en#new-game";
#elif L==4 #elif L==4
"ASSESSMENT.Games.es#nueva-juego"; "ASSESSMENT.Games.es#nuevo-juego";
#elif L==5 #elif L==5
"ASSESSMENT.Games.en#new-game"; "ASSESSMENT.Games.en#new-game";
#elif L==6 #elif L==6
"ASSESSMENT.Games.es#nueva-juego"; "ASSESSMENT.Games.es#nuevo-juego";
#elif L==7 #elif L==7
"ASSESSMENT.Games.en#new-game"; "ASSESSMENT.Games.en#new-game";
#elif L==8 #elif L==8
@ -1411,6 +1411,48 @@ const char *Hlp_ASSESSMENT_Games_edit_juego =
"ASSESSMENT.Games.en#edit-juego"; "ASSESSMENT.Games.en#edit-juego";
#endif #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 = const char *Hlp_ASSESSMENT_Games_questions =
#if L==1 #if L==1
"ASSESSMENT.Games.es#preguntas"; "ASSESSMENT.Games.es#preguntas";

View File

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

View File

@ -2050,7 +2050,7 @@ static void Svy_ShowLstGrpsToEditSurvey (long SvyCod)
NumGrpTyp < Gbl.Crs.Grps.GrpTypes.Num; NumGrpTyp < Gbl.Crs.Grps.GrpTypes.Num;
NumGrpTyp++) NumGrpTyp++)
if (Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].NumGrps) 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); SvyCod,Grp_SURVEY);
/***** End table and box *****/ /***** 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_ShowTestResultAfterAssess (long TstCod,unsigned *NumQstsNotBlank,double *TotalScore);
static void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestions, static void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestions,
struct UsrData *UsrDat, struct UsrData *UsrDat,
struct Game *Game, long GamCod,unsigned NumQst,long QstCod,MYSQL_ROW row,
unsigned NumQst,long QstCod,MYSQL_ROW row,
double *ScoreThisQst,bool *AnswerIsNotBlank); double *ScoreThisQst,bool *AnswerIsNotBlank);
static void Tst_PutFormToEditQstMedia (struct Media *Media,int NumMediaInForm, static void Tst_PutFormToEditQstMedia (struct Media *Media,int NumMediaInForm,
bool OptionsDisabled); bool OptionsDisabled);
@ -210,8 +209,7 @@ static void Tst_WriteChoiceAnsViewTest (unsigned NumQst,long QstCod,bool Shuffle
static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat, static void Tst_WriteChoiceAnsAssessTest (struct UsrData *UsrDat,
unsigned NumQst,MYSQL_RES *mysql_res, unsigned NumQst,MYSQL_RES *mysql_res,
double *ScoreThisQst,bool *AnswerIsNotBlank); double *ScoreThisQst,bool *AnswerIsNotBlank);
static void Tst_WriteChoiceAnsViewGame (struct Game *Game, static void Tst_WriteChoiceAnsViewGame (long GamCod,unsigned NumQst,long QstCod,
unsigned NumQst,long QstCod,
const char *Class, const char *Class,
bool ShowResult); bool ShowResult);
@ -866,7 +864,7 @@ static void Tst_ShowTestQuestionsWhenSeeing (MYSQL_RES *mysql_res)
Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_TO_ANSWER, Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_TO_ANSWER,
&Gbl.Usrs.Me.UsrDat, &Gbl.Usrs.Me.UsrDat,
NULL,NumQst,QstCod,row, -1L,NumQst,QstCod,row,
&ScoreThisQst, // Not used here &ScoreThisQst, // Not used here
&AnswerIsNotBlank); // Not used here &AnswerIsNotBlank); // Not used here
} }
@ -968,7 +966,7 @@ static void Tst_ShowTestResultAfterAssess (long TstCod,unsigned *NumQstsNotBlank
/***** Write question and answers *****/ /***** Write question and answers *****/
Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_RESULT, Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_RESULT,
&Gbl.Usrs.Me.UsrDat, &Gbl.Usrs.Me.UsrDat,
NULL,NumQst,QstCod,row, -1L,NumQst,QstCod,row,
&ScoreThisQst,&AnswerIsNotBlank); &ScoreThisQst,&AnswerIsNotBlank);
/***** Store test result question in database *****/ /***** 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, static void Tst_WriteQstAndAnsTest (Tst_ActionToDoWithQuestions_t ActionToDoWithQuestions,
struct UsrData *UsrDat, struct UsrData *UsrDat,
struct Game *Game, long GamCod,unsigned NumQst,long QstCod,MYSQL_ROW row,
unsigned NumQst,long QstCod,MYSQL_ROW row,
double *ScoreThisQst,bool *AnswerIsNotBlank) double *ScoreThisQst,bool *AnswerIsNotBlank)
{ {
extern const char *Txt_TST_STR_ANSWER_TYPES[Tst_NUM_ANS_TYPES]; 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: case Tst_SELECT_QUESTIONS_FOR_GAME:
break; break;
case Tst_SHOW_GAME_TO_ANSWER: case Tst_SHOW_GAME_TO_ANSWER:
Tst_WriteAnswersGameResult (Game,NumQst,QstCod, Tst_WriteAnswersGameResult (GamCod,NumQst,QstCod,
"GAM_PLAY_QST",false); // Don't show result "GAM_PLAY_QST",false); // Don't show result
break; break;
case Tst_SHOW_GAME_RESULT: case Tst_SHOW_GAME_RESULT:
Tst_WriteAnswersGameResult (Game,NumQst,QstCod, Tst_WriteAnswersGameResult (GamCod,NumQst,QstCod,
"GAM_PLAY_QST",true); // Show result "GAM_PLAY_QST",true); // Show result
break; break;
} }
@ -3528,12 +3525,12 @@ static void Tst_WriteAnswersTestResult (struct UsrData *UsrDat,
/************** Write answers of a question when viewing a game **************/ /************** 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) const char *Class,bool ShowResult)
{ {
/***** Write answer depending on type *****/ /***** Write answer depending on type *****/
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE) if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE)
Tst_WriteChoiceAnsViewGame (Game,NumQst,QstCod, Tst_WriteChoiceAnsViewGame (GamCod,NumQst,QstCod,
Class,ShowResult); Class,ShowResult);
else else
Ale_ShowAlert (Ale_ERROR,"Type of answer not valid in a game."); 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 *********/ /******** Write single or multiple choice answer when viewing a test *********/
/*****************************************************************************/ /*****************************************************************************/
static void Tst_WriteChoiceAnsViewGame (struct Game *Game, static void Tst_WriteChoiceAnsViewGame (long GamCod,unsigned NumQst,long QstCod,
unsigned NumQst,long QstCod,
const char *Class, const char *Class,
bool ShowResult) bool ShowResult)
{ {
@ -4146,7 +4142,8 @@ static void Tst_WriteChoiceAnsViewGame (struct Game *Game,
"<td class=\"DAT LEFT_TOP\">"); "<td class=\"DAT LEFT_TOP\">");
/* Get number of users who selected this answer /* Get number of users who selected this answer
and draw proportional bar */ and draw proportional bar */
Gam_GetAndDrawBarNumUsrsWhoAnswered (Game,QstCod,AnsInd); Gam_GetAndDrawBarNumUsrsWhoAnswered (GamCod,QstCod,AnsInd,
0); // TODO: NumUsrs
fprintf (Gbl.F.Out,"</td>" fprintf (Gbl.F.Out,"</td>"
"</tr>"); "</tr>");
} }
@ -8264,7 +8261,7 @@ static void Tst_ShowTestResult (time_t TstTimeUTC)
/***** Write questions and answers *****/ /***** Write questions and answers *****/
Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_RESULT, Tst_WriteQstAndAnsTest (Tst_SHOW_TEST_RESULT,
&Gbl.Usrs.Other.UsrDat, &Gbl.Usrs.Other.UsrDat,
NULL,NumQst,QstCod,row, -1L,NumQst,QstCod,row,
&ScoreThisQst, // Not used here &ScoreThisQst, // Not used here
&AnswerIsNotBlank); // 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); void Tst_WriteParamEditQst (void);
unsigned Tst_GetNumAnswersQst (long QstCod); unsigned Tst_GetNumAnswersQst (long QstCod);
unsigned Tst_GetAnswersQst (long QstCod,MYSQL_RES **mysql_res,bool Shuffle); 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); const char *Class,bool ShowResult);
bool Tst_CheckIfQuestionIsValidForGame (long QstCod); bool Tst_CheckIfQuestionIsValidForGame (long QstCod);
void Tst_WriteAnsTF (char AnsTF); 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."; "Ao fazer isso, voc&ecirc; remover&aacute; %u estudantes desse grupo.";
#endif #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 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 #if L==1 // ca
"De veres voleu eliminar la foto de <strong>%s</strong>?"; "De veres voleu eliminar la foto de <strong>%s</strong>?";
@ -17812,9 +17833,72 @@ const char *Txt_Marks_area =
"Zona de notas"; "Zona de notas";
#endif #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 = const char *Txt_Materials =
#if L==1 // ca #if L==1 // ca
"Materiales"; // Necessita traduccio "Materials";
#elif L==2 // de #elif L==2 // de
"Material"; "Material";
#elif L==3 // en #elif L==3 // en
@ -23779,6 +23863,27 @@ const char *Txt_New_link =
"Nova liga&ccedil;&atilde;o"; "Nova liga&ccedil;&atilde;o";
#endif #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 = const char *Txt_New_message =
#if L==1 // ca #if L==1 // ca
"Nou missatge"; "Nou missatge";
@ -32034,6 +32139,27 @@ const char *Txt_Remove_logo =
"Remover logotipo"; "Remover logotipo";
#endif #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 = const char *Txt_Remove_me =
#if L==1 // ca #if L==1 // ca
"Eliminarme"; "Eliminarme";
@ -40896,23 +41022,23 @@ const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES] =
#endif #endif
}; };
const char *Txt_Start_game = const char *Txt_Start_match =
#if L==1 // ca #if L==1 // ca
"Comen&ccedil;ar joc"; "Comen&ccedil;ar partida";
#elif L==2 // de #elif L==2 // de
"Spiel starten"; "Spiel starten";
#elif L==3 // en #elif L==3 // en
"Start game"; "Start match";
#elif L==4 // es #elif L==4 // es
"Comenzar juego"; "Comenzar partida";
#elif L==5 // fr #elif L==5 // fr
"Commencer le jeu"; "Commencer le match";
#elif L==6 // gn #elif L==6 // gn
"&Ntilde;epyr&utilde; &ntilde;embosar&aacute;i"; "&Ntilde;epyr&utilde; &ntilde;embosar&aacute;i";
#elif L==7 // it #elif L==7 // it
"Inizia il gioco"; "Inizia la partita";
#elif L==8 // pl #elif L==8 // pl
"Rozpocznij gr&eogon;"; "Rozpocznij mecz";
#elif L==9 // pt #elif L==9 // pt
"Come&ccedil;ar o jogo"; "Come&ccedil;ar o jogo";
#endif #endif