//--------------------------------------------------------------------------- #include "KPLTypes.h" #include "WriteScript.h" #include "GenerateScript.h" #include #include //--------------------------------------------------------------------------- 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;pNbrPlayers;++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;pNbrPlayers;++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); }