summaryrefslogtreecommitdiff
path: root/WriteScript.cpp
diff options
context:
space:
mode:
authorEric Anderson <ejona86@gmail.com>2009-05-01 17:14:46 -0500
committerEric Anderson <ejona86@gmail.com>2009-05-01 17:14:46 -0500
commit663d9336324110648ffdea7c7092a004353419b5 (patch)
treed35eccc38a36859bc317796a2058497ed9d8c382 /WriteScript.cpp
downloadkpl-663d9336324110648ffdea7c7092a004353419b5.tar.gz
kpl-663d9336324110648ffdea7c7092a004353419b5.zip
Initial commit of source from zwzsg
Diffstat (limited to 'WriteScript.cpp')
-rw-r--r--WriteScript.cpp225
1 files changed, 225 insertions, 0 deletions
diff --git a/WriteScript.cpp b/WriteScript.cpp
new file mode 100644
index 0000000..174894f
--- /dev/null
+++ b/WriteScript.cpp
@@ -0,0 +1,225 @@
+//---------------------------------------------------------------------------
+#include "KPLTypes.h"
+#include "WriteScript.h"
+#include "GenerateScript.h"
+#include <stdio.h>
+#include <string.h>
+//---------------------------------------------------------------------------
+
+FILE *current_file=0;
+int tab_count=0;
+
+static int WriteString(const char* string)
+{
+ return fwrite(string,1,strlen(string),current_file);
+}
+
+static int WriteEndLine()
+{
+ return WriteString("\n");
+}
+
+static int WriteTabbedLine(const char* string)
+{
+ int tabs,ret;
+ for(tabs=1;tabs<=tab_count;++tabs)
+ WriteString("\x09");
+ ret=WriteString(string);
+ WriteEndLine();
+ return ret;
+}
+
+static int WriteFieldName(const char* string)
+{
+ int tabs,ret;
+ for(tabs=1;tabs<=tab_count;++tabs)
+ WriteString("\x09");
+ ret=WriteString(string);
+ WriteString("=");
+ return ret;
+}
+
+static int WriteFieldValue(const char* string)
+{
+ int ret;
+ ret=WriteString(string);
+ WriteString(";");
+ WriteEndLine();
+ return ret;
+}
+
+
+static char fieldvaluestr[256];
+static int WriteNumFieldValue(int fieldvalue)
+{
+ sprintf(fieldvaluestr,"%d",fieldvalue);
+ WriteFieldValue(fieldvaluestr);
+ return 0;
+}
+
+static int WriteField(const char* fieldname,const char* fieldvalue)
+{
+ WriteFieldName(fieldname);
+ WriteFieldValue(fieldvalue);
+ return 0;
+}
+
+static int WriteNumField(const char* fieldname,int fieldvalue)
+{
+ WriteFieldName(fieldname);
+ WriteNumFieldValue(fieldvalue);
+ return 0;
+}
+
+static int WriteFieldAndComment(const char* fieldname, const char* fieldvalue, const char* comment)
+{
+ WriteFieldName(fieldname);
+ WriteString(fieldvalue);
+ WriteString(";// ");
+ WriteString(comment);
+ WriteEndLine();
+ return 0;
+}
+
+static int StartSubSection(const char* string)
+{
+ int tabs;
+ for(tabs=1;tabs<=tab_count;++tabs)
+ WriteString("\x09");
+ WriteString("[");
+ WriteString(string);
+ WriteString("]");
+ WriteEndLine();
+ WriteTabbedLine("{");
+ tab_count++;
+ return 0;
+}
+
+static int EndSubSection()
+{
+ --tab_count;
+ WriteTabbedLine("}");
+ return 0;
+}
+
+
+void WriteScript(cKPgame* game)
+{
+ FILE *stream;
+ int p,at;
+ int maxallyteam;
+
+ stream=fopen(game->ScriptFileName,"w+t");
+ if(!stream)
+ return;
+
+ current_file=stream;
+ tab_count=0;
+
+ WriteEndLine();
+ WriteTabbedLine("// To run this script, drag and drop over Spring.exe");
+ WriteTabbedLine("//");
+ WriteTabbedLine("// K.P.L. (Kernel Panic Launcher) Generated Script");
+ WriteString("// ");
+ WriteTabbedLine(game->description);
+ WriteEndLine();
+
+ StartSubSection("GAME");
+
+ WriteField("GameType",game->ModFileName);
+ WriteField("Mapname",game->map->FileName);
+ WriteEndLine();
+
+ // List of modoptions;
+ StartSubSection("MODOPTIONS");
+ WriteTabbedLine("// KP specific:");
+ WriteNumField("ons",game->ModOptions->ons);
+ WriteNumField("minelauncher",game->ModOptions->minelauncher);
+ WriteNumField("nx",game->ModOptions->nx);
+ WriteEndLine();
+ WriteTabbedLine("// Generic, but still applying to KP:");
+ WriteNumField("GameMode",game->EndCondition);
+ WriteTabbedLine(" // 0 for \"Kill everything!\"");
+ WriteTabbedLine(" // 1 for \"Kill all factories!\"");
+ WriteTabbedLine(" // 2 for \"Kill the Kernel!\"");
+ WriteField("ghostedbuildings","1");
+ WriteField("fixedallies","0");
+ WriteField("MaxUnits","512");
+ WriteField("MinSpeed","0.1");
+ WriteField("MaxSpeed","10");
+ WriteEndLine();
+ WriteTabbedLine("// Irrelevant for KP:");
+ WriteField("StartMetal","1024");
+ WriteField("StartEnergy","1024");
+ //WriteField("LimitDGun","0");
+ //WriteField("DiminishingMMs","0");
+ EndSubSection();
+ WriteEndLine();
+
+ WriteField("HostIP","localhost");
+ WriteField("HostPort","1377");
+ WriteField("IsHost","1");
+ WriteEndLine();
+
+ WriteFieldAndComment("StartPosType","0","0 for fixed, 1 for random, 2 for chosen");
+ WriteField("MyPlayerNum","0");
+ WriteField("MyPlayerName","Single Player");
+ WriteNumField("NumPlayers",1);
+ WriteNumField("NumTeams",game->NbrPlayers);
+ WriteField("NumAllyTeams","2");//<- Uhoh, NOT!
+ WriteEndLine();
+
+ WriteTabbedLine("// List of human controlled players:");
+ StartSubSection("PLAYER0");
+ WriteField("name","Single Player");
+ WriteNumField("Team",(game->isSpeccing?0:game->PlayerTeamNum));
+ WriteNumField("Spectator",game->isSpeccing);
+ EndSubSection();
+ WriteEndLine();
+
+ WriteTabbedLine("// List of \"teams\" (or \"players\" depending on terminology):");
+ for(p=0;p<game->NbrPlayers;++p)
+ {
+ char teamname[32];
+ char colorthing[256];
+ cKPplayer* teaminfo=game->players[p];
+ sprintf(teamname,"TEAM%d",p);
+ StartSubSection(teamname);
+ WriteField("TeamLeader","0");
+ WriteNumField("AllyTeam",teaminfo->allyteam);
+ WriteField("Handicap","0");
+ WriteField("Side",teaminfo->faction->name);
+ WriteFieldName("RGBColor");
+ sprintf(colorthing,"%.4f %.4f %.4f",(float)teaminfo->color[0]/255,(float)teaminfo->color[1]/255,(float)teaminfo->color[2]/255);
+ WriteFieldValue(colorthing);
+ if(p!=game->PlayerTeamNum || game->isSpeccing)
+ WriteField("AIDLL","LuaAI:Kernel Panic AI\x00PaddingPaddingPaddingPadding");
+ EndSubSection();
+ }
+ WriteEndLine();
+
+ WriteTabbedLine("// List of ally teams: This is for assymetrical alliances");
+ maxallyteam=GetMaxAllyTeam(game);
+ for(at=0;at<=maxallyteam;++at)
+ {
+ char allyteamname[32];
+ volatile int nbrallies=0;
+ sprintf(allyteamname,"ALLYTEAM%d",at);
+ StartSubSection(allyteamname);
+ for(p=0;p<game->NbrPlayers;++p)
+ if(game->players[p]->allyteam==at)
+ ++nbrallies;
+ WriteNumField("NumAllies",0*nbrallies);
+ EndSubSection();
+ }
+ WriteEndLine();
+
+ WriteTabbedLine("// List of restrictions");
+ WriteNumField("NumRestrictions",0),
+ StartSubSection("RESTRICT");
+ EndSubSection();
+
+ EndSubSection();
+ fclose(stream);
+}
+