# HG changeset patch # User Wuzzy # Date 1545243042 -3600 # Node ID 4b678aad50e985c9f852804c068e1e860257a1d9 # Parent 2113296b7a296d299650a6fa1973cbcebebcbbeb Lua API: Add functions to add team selected in campaign/mission page diff -r 2113296b7a29 -r 4b678aad50e9 ChangeLog.txt --- a/ChangeLog.txt Wed Dec 19 05:50:02 2018 +0100 +++ b/ChangeLog.txt Wed Dec 19 19:10:42 2018 +0100 @@ -23,6 +23,8 @@ + New call: GetMissionVar(varname): Get value of mission variable + New call: SetTurnTimePaused(isPaused): Call with true to pause turn time, false to unpause + New call: GetTurnTimePaused(): Returns true if turn time is paused due to Lua + + New call: AddMissionTeam(color): Add mission team, i.e. the team selected by player in campaign/mission page + + New call: AddMissionHog(health): Add a hedgehog for the mission team + Utils library: New calls: getReadableChallengeRecord, updateChallengeRecord + New callback: onGameResult(winningClan): Called when the game ends normally. winningClan = index of winning clan or -1 on draw + Params explode, poison in the SpawnFake*Crate functions now optional and default to false diff -r 2113296b7a29 -r 4b678aad50e9 QTfrontend/game.cpp --- a/QTfrontend/game.cpp Wed Dec 19 05:50:02 2018 +0100 +++ b/QTfrontend/game.cpp Wed Dec 19 19:10:42 2018 +0100 @@ -29,6 +29,8 @@ #include "hwform.h" #include "ui/page/pageoptions.h" +#include "ui/page/pagetraining.h" +#include "ui/page/pagecampaign.h" #include "game.h" #include "hwconsts.h" #include "gameuiconfig.h" @@ -183,6 +185,14 @@ { QByteArray traincfg; HWProto::addStringToBuffer(traincfg, "TL"); + + HWTeam missionTeam = HWTeam(); + missionTeam.setName(config->Form->ui.pageTraining->CBTeam->currentText()); + missionTeam.loadFromFile(); + missionTeam.setNumHedgehogs(HEDGEHOGS_PER_TEAM); + missionTeam.setMissionTeam(true); + HWProto::addStringListToBuffer(traincfg, missionTeam.teamGameConfig(100)); + HWProto::addStringToBuffer(traincfg, "eseed " + QUuid::createUuid().toString()); HWProto::addStringToBuffer(traincfg, "escript " + trainingScript); @@ -193,8 +203,15 @@ { QByteArray campaigncfg; HWProto::addStringToBuffer(campaigncfg, "TL"); + + HWTeam missionTeam = HWTeam(); + missionTeam.setName(config->Form->ui.pageCampaign->CBTeam->currentText()); + missionTeam.loadFromFile(); + missionTeam.setNumHedgehogs(HEDGEHOGS_PER_TEAM); + missionTeam.setMissionTeam(true); + HWProto::addStringListToBuffer(campaigncfg, missionTeam.teamGameConfig(100)); + HWProto::addStringToBuffer(campaigncfg, "eseed " + QUuid::createUuid().toString()); - HWProto::addStringToBuffer(campaigncfg, "escript " + campaignScript); RawSendIPC(campaigncfg); diff -r 2113296b7a29 -r 4b678aad50e9 QTfrontend/team.cpp --- a/QTfrontend/team.cpp Wed Dec 19 05:50:02 2018 +0100 +++ b/QTfrontend/team.cpp Wed Dec 19 19:10:42 2018 +0100 @@ -35,6 +35,7 @@ , m_difficulty(0) , m_numHedgehogs(4) , m_isNetTeam(false) + , m_isMissionTeam(false) { m_name = teamname; OldTeamName = m_name; @@ -61,6 +62,7 @@ QObject(0) , m_numHedgehogs(4) , m_isNetTeam(true) + , m_isMissionTeam(false) { // net teams are configured from QStringList if(strLst.size() != 23) throw HWTeamConstructException(); @@ -88,6 +90,7 @@ , m_difficulty(0) , m_numHedgehogs(4) , m_isNetTeam(false) + , m_isMissionTeam(false) { m_name = QString("Team"); for (int i = 0; i < HEDGEHOGS_PER_TEAM; i++) @@ -125,6 +128,7 @@ , m_numHedgehogs(other.m_numHedgehogs) , m_color(other.m_color) , m_isNetTeam(other.m_isNetTeam) + , m_isMissionTeam(other.m_isMissionTeam) , m_owner(other.m_owner) // , AchievementProgress(other.AchievementProgress) { @@ -149,6 +153,7 @@ m_isNetTeam = other.m_isNetTeam; m_owner = other.m_owner; m_color = other.m_color; + m_isMissionTeam = other.m_isMissionTeam; } return *this; @@ -243,12 +248,25 @@ QStringList HWTeam::teamGameConfig(quint32 InitHealth) const { QStringList sl; + QString cmdAddHog = "eaddhh"; + if (m_isNetTeam) { sl.push_back(QString("eaddteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(QString(QCryptographicHash::hash(m_owner.toUtf8(), QCryptographicHash::Md5).toHex()))); sl.push_back("erdriven"); } - else sl.push_back(QString("eaddteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(playerHash)); + else + { + if (m_isMissionTeam) + { + sl.push_back(QString("esetmissteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(playerHash)); + cmdAddHog = "eaddmisshh"; + } + else + { + sl.push_back(QString("eaddteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(playerHash)); + } + } sl.push_back(QString("egrave " + m_grave)); sl.push_back(QString("efort " + m_fort)); @@ -260,7 +278,7 @@ for (int t = 0; t < m_numHedgehogs; t++) { - sl.push_back(QString("eaddhh %1 %2 %3") + sl.push_back(QString(cmdAddHog + " %1 %2 %3") .arg(QString::number(m_difficulty), QString::number(InitHealth), m_hedgehogs[t].Name)); @@ -281,6 +299,15 @@ return m_isNetTeam; } +void HWTeam::setMissionTeam(bool isMissionTeam) +{ + m_isMissionTeam = isMissionTeam; +} + +bool HWTeam::isMissionTeam() const +{ + return m_isMissionTeam; +} bool HWTeam::operator==(const HWTeam& t1) const { diff -r 2113296b7a29 -r 4b678aad50e9 QTfrontend/team.h --- a/QTfrontend/team.h Wed Dec 19 05:50:02 2018 +0100 +++ b/QTfrontend/team.h Wed Dec 19 19:10:42 2018 +0100 @@ -72,6 +72,7 @@ QString grave() const; const HWHog & hedgehog(unsigned int idx) const; bool isNetTeam() const; + bool isMissionTeam() const; QString keyBind(unsigned int idx) const; QString name() const; unsigned char numHedgehogs() const; @@ -89,6 +90,7 @@ void setNumHedgehogs(unsigned char num); void setVoicepack(const QString & voicepack); void setNetTeam(bool isNetTeam); + void setMissionTeam(bool isMissionTeam); // convert team info into strings for further computation QStringList teamGameConfig(quint32 InitHealth) const; @@ -119,6 +121,7 @@ quint8 m_numHedgehogs; int m_color; bool m_isNetTeam; + bool m_isMissionTeam; QString m_owner; // class members that contain statistics, etc. diff -r 2113296b7a29 -r 4b678aad50e9 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Wed Dec 19 05:50:02 2018 +0100 +++ b/hedgewars/uScript.pas Wed Dec 19 19:10:42 2018 +0100 @@ -2307,6 +2307,43 @@ lc_addteam:= 0;//1; end; +function lc_addmissionteam(L : Plua_State) : LongInt; Cdecl; +var colorArg: Int64; + colorStr: shortstring; +begin + if CheckLuaParamCount(L, 1, 'AddMissionTeam', 'color') then + begin + if(MissionTeam = nil) then + begin + OutError('Lua error: AddMissionTeam: Could not add team. Note: This function only works in singleplayer missions!', true); + lc_addmissionteam:= 0; + exit; + end; + + colorArg:= Trunc(lua_tonumber(L, 1)); + if (colorArg < 0) and (abs(colorArg) <= cClanColors) then + // Pick clan color from settings (recommended) + colorStr:= IntToStr(ClanColorArray[Pred(abs(colorArg))]) + else if (colorArg >= 0) and (colorArg <= $ffffffff) then + // Specify color directly + colorStr:= IntToStr(colorArg) + else + begin + OutError('Lua error: AddMissionTeam: Invalid ''color'' argument, must be between '+IntToStr(-cClanColors)+' and 0xffffffff!', true); + lc_addmissionteam:= 0; + exit; + end; + + ParseCommand('addteam x ' + colorStr + ' ' + MissionTeam^.TeamName, true, true); + ParseCommand('grave ' + MissionTeam^.GraveName, true, true); + ParseCommand('fort ' + MissionTeam^.FortName, true, true); + ParseCommand('voicepack ' + MissionTeam^.Voicepack^.name, true, true); + ParseCommand('flag ' + MissionTeam^.Flag, true, true); + CurrentTeam^.Binds:= DefaultBinds + end; + lc_addmissionteam:= 0; +end; + function lc_setteamlabel(L : Plua_State) : LongInt; Cdecl; var teamValue: ansistring; i, n: LongInt; @@ -2499,13 +2536,13 @@ function lc_addhog(L : Plua_State) : LongInt; Cdecl; -var temp: ShortString; +var hatName: ShortString; begin if CheckLuaParamCount(L, 4, 'AddHog', 'hogname, botlevel, health, hat') then begin - temp:= lua_tostring(L, 4); + hatName:= lua_tostring(L, 4); ParseCommand('addhh ' + lua_tostring(L, 2) + ' ' + lua_tostring(L, 3) + ' ' + lua_tostring(L, 1), true, true); - ParseCommand('hat ' + temp, true, true); + ParseCommand('hat ' + hatName, true, true); lua_pushnumber(L, CurrentHedgehog^.Gear^.uid); end else @@ -2513,6 +2550,31 @@ lc_addhog:= 1; end; +function lc_addmissionhog(L : Plua_State) : LongInt; Cdecl; +var hatName: ShortString; +begin + if CheckLuaParamCount(L, 1, 'AddMissionHog', 'health') then + begin + if(MissionTeam = nil) then + begin + OutError('Lua error: AddMissionHog: Could not add hog. Mission team is not set!', true); + lua_pushnil(L); + lc_addmissionhog:= 1; + exit; + end; + with MissionTeam^.Hedgehogs[CurrentTeam^.HedgehogsNumber] do + begin + hatName:= Hat; + ParseCommand('addhh ' + IntToStr(BotLevel) + ' ' + lua_tostring(L, 1) + ' ' + Name, true, true); + ParseCommand('hat ' + hatName, true, true); + end; + lua_pushnumber(L, CurrentHedgehog^.Gear^.uid); + end + else + lua_pushnil(L); + lc_addmissionhog:= 1; +end; + function lc_hogturnleft(L : Plua_State) : LongInt; Cdecl; var gear: PGear; begin @@ -4289,8 +4351,10 @@ lua_register(luaState, _P'GetTeamIndex', @lc_getteamindex); lua_register(luaState, _P'GetTeamClan', @lc_getteamclan); lua_register(luaState, _P'AddTeam', @lc_addteam); +lua_register(luaState, _P'AddMissionTeam', @lc_addmissionteam); lua_register(luaState, _P'SetTeamLabel', @lc_setteamlabel); lua_register(luaState, _P'AddHog', @lc_addhog); +lua_register(luaState, _P'AddMissionHog', @lc_addmissionhog); lua_register(luaState, _P'AddAmmo', @lc_addammo); lua_register(luaState, _P'GetAmmoCount', @lc_getammocount); lua_register(luaState, _P'HealHog', @lc_healhog); diff -r 2113296b7a29 -r 4b678aad50e9 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Wed Dec 19 05:50:02 2018 +0100 +++ b/hedgewars/uTeams.pas Wed Dec 19 19:10:42 2018 +0100 @@ -29,6 +29,7 @@ procedure freeModule; function AddTeam(TeamColor: Longword): PTeam; +function SetMissionTeam(TeamColor: Longword): PTeam; procedure SwitchHedgehog; procedure AfterSwitchHedgehog; procedure InitTeams; @@ -476,6 +477,19 @@ end; end; +function SetMissionTeam(TeamColor: Longword): PTeam; +var team: PTeam; +begin +New(team); +if checkFails(team <> nil, 'AddTeam: team = nil', true) then exit(nil); +FillChar(team^, sizeof(TTeam), 0); +team^.HedgehogsNumber:= 0; + +CurrentTeam:= team; +MissionTeam:= team; +SetMissionTeam:= team; +end; + function AddTeam(TeamColor: Longword): PTeam; var team: PTeam; c: LongInt; @@ -679,6 +693,30 @@ end end; +procedure chAddMissionHH(var id: shortstring); +var s: shortstring; + Health: LongInt; +begin +s:= ''; +if (not isDeveloperMode) then + exit; +if checkFails((CurrentTeam <> nil), 'Can''t add hedgehogs yet, add a team first!', true) then exit; +with CurrentTeam^ do + begin + if checkFails(HedgehogsNumber<=cMaxHHIndex, 'Can''t add hedgehog to "' + TeamName + '"! (already ' + intToStr(HedgehogsNumber) + ' hogs)', true) then exit; + SplitBySpace(id, s); + CurrentHedgehog:= @Hedgehogs[HedgehogsNumber]; + CurrentHedgehog^.BotLevel:= StrToInt(id); + CurrentHedgehog^.Team:= CurrentTeam; + SplitBySpace(s, id); + Health:= StrToInt(s); + if checkFails((Health > 0) and (Health <= cMaxHogHealth), 'Invalid hedgehog health (must be between 1 and '+IntToStr(cMaxHogHealth)+')', true) then exit; + CurrentHedgehog^.Name:= id; + CurrentHedgehog^.InitialHealth:= Health; + inc(HedgehogsNumber) + end +end; + procedure chAddHH(var id: shortstring); var s: shortstring; Gear: PGear; @@ -744,7 +782,7 @@ // color is always little endian so the mask must be constant also in big endian archs Color:= Color or $FF000000; AddTeam(Color); - + if CurrentTeam <> nil then begin CurrentTeam^.TeamName:= ts; @@ -759,6 +797,31 @@ end end; +procedure chSetMissionTeam(var s: shortstring); +var Color: Longword; + ts, cs: shortstring; +begin +cs:= ''; +ts:= ''; +if isDeveloperMode then + begin + SplitBySpace(s, cs); + SplitBySpace(cs, ts); + Color:= StrToInt(cs); + + // color is always little endian so the mask must be constant also in big endian archs + Color:= Color or $FF000000; + SetMissionTeam(Color); + + if CurrentTeam <> nil then + begin + CurrentTeam^.TeamName:= ts; + CurrentTeam^.PlayerHash:= s; + CurrentTeam^.voicepack:= AskForVoicepack('Default') + end + end +end; + procedure chSetHHCoords(var x: shortstring); var y: shortstring; t: Longint; @@ -941,7 +1004,9 @@ procedure initModule; begin RegisterVariable('addhh', @chAddHH, false); +RegisterVariable('addmisshh', @chAddMissionHH, false); RegisterVariable('addteam', @chAddTeam, false); +RegisterVariable('setmissteam', @chSetMissionTeam, false); RegisterVariable('hhcoords', @chSetHHCoords, false); RegisterVariable('bind', @chBind, true ); RegisterVariable('teamgone', @chTeamGone, true ); diff -r 2113296b7a29 -r 4b678aad50e9 hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Wed Dec 19 05:50:02 2018 +0100 +++ b/hedgewars/uVariables.pas Wed Dec 19 19:10:42 2018 +0100 @@ -2488,6 +2488,7 @@ CurrentTeam: PTeam; PreviousTeam: PTeam; + MissionTeam: PTeam; CurrentHedgehog: PHedgehog; TeamsArray: array[0..Pred(cMaxTeams)] of PTeam; TeamsCount: Longword; // number of teams on game start @@ -2941,6 +2942,7 @@ GearsList:= nil; CurrentTeam:= nil; PreviousTeam:= nil; + MissionTeam:= nil; CurrentHedgehog:= nil; FollowGear:= nil; lastVisualGearByUID:= nil;