Skip to content

Commit

Permalink
Next gen wurstsetup integration (#814)
Browse files Browse the repository at this point in the history
* blah

* more

* implement wc3lib updates

* update dependency and fix api calls

* fix for #777

* updt

* Add jass synth

thx @WaterKnight

* test synth

* fixup jass synth thx @WaterKnight

* fix indent

* remove file overhead from mpq insert

* remove pointless comments

* don't manipulate input w3i if no config present

* Update build.gradle
  • Loading branch information
Frotty committed Mar 17, 2019
1 parent 0b22eb2 commit 6f049e5
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 20 deletions.
4 changes: 2 additions & 2 deletions de.peeeq.wurstscript/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,10 @@ dependencies {
compile group: 'com.github.inwc3', name: 'jmpq3', version: '1.7.7'

// Water's wc3 libs
compile 'com.github.inwc3:wc3libs:7fe3b95163'
compile 'com.github.inwc3:wc3libs:159f640c97'

// The setup tool for wurst.build handling
compile 'com.github.wurstscript:wurstsetup:cc208dcc86'
compile 'com.github.wurstscript:wurstsetup:d21aaa4673'

compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package de.peeeq.wurstio.languageserver.requests;

import com.google.common.io.Files;
import config.*;
import de.peeeq.wurstio.Pjass;
import de.peeeq.wurstio.gui.WurstGuiImpl;
import de.peeeq.wurstio.languageserver.ModelManager;
import de.peeeq.wurstio.languageserver.WFile;
Expand All @@ -12,14 +14,16 @@
import de.peeeq.wurstscript.ast.WurstModel;
import de.peeeq.wurstscript.attributes.CompileError;
import de.peeeq.wurstscript.gui.WurstGui;
import file.WurstProjectConfig;
import file.WurstProjectConfigData;
import net.moonlightflower.wc3libs.bin.app.MapHeader;
import net.moonlightflower.wc3libs.bin.app.W3I;
import net.moonlightflower.wc3libs.dataTypes.app.Controller;
import org.eclipse.lsp4j.MessageType;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

/**
Expand Down Expand Up @@ -49,7 +53,7 @@ public Object execute(ModelManager modelManager) throws IOException {
}

WurstProjectConfigData projectConfig = WurstProjectConfig.INSTANCE.loadProject(workspaceRoot.getFile().toPath().resolve(FILE_NAME));
if(projectConfig == null) {
if (projectConfig == null) {
throw new RequestFailedException(MessageType.Error, FILE_NAME + " file doesn't exist or is invalid. " +
"Please refresh your project using an up to date wurst setup tool.");
}
Expand All @@ -75,6 +79,7 @@ public Object execute(ModelManager modelManager) throws IOException {
}
Files.copy(map, targetMap);


// first compile the script:
File compiledScript = compileScript(gui, modelManager, compileArgs, targetMap, map);

Expand All @@ -85,16 +90,9 @@ public Object execute(ModelManager modelManager) throws IOException {
println("We will try to start the map now, but it will probably fail. ");
}


// then inject the script into the map
gui.sendProgress("Injecting mapscript");
try (MpqEditor mpqEditor = MpqEditorFactory.getEditor(targetMap)) {
mpqEditor.deleteFile("war3map.j");
mpqEditor.insertFile("war3map.j", compiledScript);
}

gui.sendProgress("Applying Map Config...");
applyProjectConfig(projectConfig, targetMap);
applyProjectConfig(projectConfig, targetMap, compiledScript);

gui.sendProgress("Done.");
} catch (CompileError e) {
WLogger.info(e);
Expand All @@ -109,30 +107,112 @@ public Object execute(ModelManager modelManager) throws IOException {
return "ok"; // TODO
}

private void applyProjectConfig(WurstProjectConfigData projectConfig, File targetMap) throws IOException {
private W3I prepareW3I(WurstProjectConfigData projectConfig, File targetMap) throws Exception {
try (MpqEditor mpq = MpqEditorFactory.getEditor((targetMap))) {
W3I w3I = new W3I(mpq.extractFile("war3map.w3i"));
WurstProjectBuildMapData buildMapData = projectConfig.getBuildMapData();
w3I.setMapName(buildMapData.getName());
w3I.setMapAuthor(buildMapData.getAuthor());
WurstProjectBuildScenarioData scenarioData = buildMapData.getScenarioData();
w3I.setPlayersRecommendedAmount(scenarioData.getSuggestedPlayers());
w3I.setMapDescription(scenarioData.getDescription());

if (buildMapData.getPlayers().size() > 0) {
applyPlayers(projectConfig, w3I);
}
if (buildMapData.getForces().size() > 0) {
applyForces(projectConfig, w3I);
}
if (scenarioData.getLoadingScreen() != null) {
applyLoadingScreen(w3I, scenarioData.getLoadingScreen());
}
return w3I;
}
}

private void applyProjectConfig(WurstProjectConfigData projectConfig, File targetMap, File compiledScript) throws IOException {
if (projectConfig.getBuildMapData().getFileName().isEmpty()) {
throw new RequestFailedException(MessageType.Error, "wurst.build is missing mapFileName");
}

if (!projectConfig.getBuildMapData().getName().isEmpty()) {
try (MpqEditor mpq = MpqEditorFactory.getEditor((targetMap))) {
W3I w3I = new W3I(mpq.extractFile("war3map.w3i"));
w3I.setMapName(projectConfig.getBuildMapData().getName());
w3I.setMapAuthor(projectConfig.getBuildMapData().getAuthor());

// Apply w3i config values
W3I w3I = prepareW3I(projectConfig, targetMap);
FileInputStream inputStream = new FileInputStream(compiledScript);
StringWriter sw = new StringWriter();
w3I.injectConfigsInJassScript(inputStream, sw);

File file = new File(getBuildDir(), "wc3libs.j");
byte[] scriptBytes = sw.toString().getBytes();
Files.write(scriptBytes, file);
Pjass.runPjass(file);
mpq.insertFile("war3map.j", scriptBytes);

File w3iFile = new File("w3iFile");
w3I.write(w3iFile);

mpq.deleteFile("war3map.w3i");
mpq.insertFile("war3map.w3i", java.nio.file.Files.readAllBytes(w3iFile.toPath()));
file.delete();
w3iFile.delete();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

applyMapHeader(projectConfig, targetMap);
}

private void applyLoadingScreen(W3I w3I, WurstProjectBuildLoadingScreenData loadingScreen) {
w3I.setLoadingScreenModel(loadingScreen.getModel());
w3I.getLoadingScreen().setTitle(loadingScreen.getTitle());
w3I.getLoadingScreen().setSubtitle(loadingScreen.getSubTitle());
w3I.getLoadingScreen().setText(loadingScreen.getText());
}

private void applyForces(WurstProjectConfigData projectConfig, W3I w3I) {
w3I.clearForces();
ArrayList<WurstProjectBuildForce> forces = projectConfig.getBuildMapData().getForces();
for (WurstProjectBuildForce wforce : forces) {
W3I.Force force = w3I.addForce();
force.setName(wforce.getName());
force.setFlag(W3I.Force.Flags.Flag.ALLIED, wforce.getFlags().getAllied());
force.setFlag(W3I.Force.Flags.Flag.ALLIED_VICTORY, wforce.getFlags().getAlliedVictory());
force.setFlag(W3I.Force.Flags.Flag.SHARED_VISION, wforce.getFlags().getSharedVision());
force.setFlag(W3I.Force.Flags.Flag.SHARED_UNIT_CONTROL, wforce.getFlags().getSharedControl());
force.setFlag(W3I.Force.Flags.Flag.SHARED_UNIT_CONTROL_ADVANCED, wforce.getFlags().getSharedControlAdvanced());
force.addPlayerNums(wforce.getPlayerIds());
}
}

private void applyPlayers(WurstProjectConfigData projectConfig, W3I w3I) {
w3I.getPlayers().clear();
ArrayList<WurstProjectBuildPlayer> players = projectConfig.getBuildMapData().getPlayers();
for (WurstProjectBuildPlayer wplayer : players) {
W3I.Player player = w3I.addPlayer();
if(! wplayer.getName().equalsIgnoreCase("defaultplayer")) {
player.setName(wplayer.getName());
}

W3I.Player.UnitRace val = W3I.Player.UnitRace.valueOf(wplayer.getRace().toString());
if (val != null) {
player.setRace(val);
}
Controller val1 = Controller.valueOf(wplayer.getController().toString());
if(val1 != null) {
player.setType(val1);
}
player.setNum(wplayer.getId());
player.setStartPosFixed(wplayer.getFixedStartLoc() ? 1 : 0);
}
}

private void applyMapHeader(WurstProjectConfigData projectConfig, File targetMap) throws IOException {
MapHeader mapHeader = MapHeader.ofFile(targetMap);
mapHeader.setMaxPlayersCount(projectConfig.getBuildMapData().getPlayerCount());
mapHeader.setMapName(projectConfig.getBuildMapData().getFileName());
mapHeader.setMaxPlayersCount(projectConfig.getBuildMapData().getPlayers().size());
mapHeader.setMapName(projectConfig.getBuildMapData().getName());
mapHeader.writeToMapFile(targetMap);
}

Expand Down
Empty file modified de.peeeq.wurstscript/src/main/resources/pjass
100755 → 100644
Empty file.

0 comments on commit 6f049e5

Please sign in to comment.