--- 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
--- 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);
--- 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
{
--- 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.
--- 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);
--- 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 );
--- 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;