Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix players in force #30

Merged
merged 1 commit into from
Feb 24, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 29 additions & 24 deletions src/main/java/net/moonlightflower/wc3libs/bin/app/W3I.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
import java.io.IOException;
import java.io.PrintStream;
import java.util.*;
import java.util.function.Function;
import java.util.function.IntConsumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
* info file for wrapping war3map.w3i
Expand Down Expand Up @@ -1064,50 +1068,45 @@ public void setFlag(@Nonnull Flags.Flag flag, boolean val) {
_flags.setFlag(flag, val);
}

private int _players = 0;
private BitSet _players = new BitSet();

public int getPlayers() {
@Nonnull
public BitSet getPlayers() {
return _players;
}

public void setPlayers(int val) {
public void setPlayers(@Nonnull BitSet val) {
_players = val;
}

public Set<Integer> getPlayerNums() {
Set<Integer> ret = new LinkedHashSet<>();

int players = _players;
int c = 0;
ret.addAll(_players.stream().boxed().collect(Collectors.toList()));

while (players != 0) {
if ((players & 1) == 1) ret.add(c);
return ret;
}

c++;
players >>= 1;
}
public Set<Integer> getPlayerNums(@Nonnull List<Player> definedPlayers) {
Set<Integer> definedPlayerNums = definedPlayers.stream().map(Player::getNum).collect(Collectors.toSet());

Set<Integer> ret = getPlayerNums();

ret.removeIf(playerNum -> !definedPlayerNums.contains(playerNum));

return ret;
}

public void removePlayerNums(int... players) {
int rem = 0;

for (int player : players) {
rem |= (1 << player);
_players.clear(player);
}

_players &= ~rem;
}

public void addPlayerNums(int... players) {
int add = 0;

for (int player : players) {
add |= (1 << player);
_players.set(player);
}

_players |= add;
}

private String _name;
Expand All @@ -1123,7 +1122,7 @@ public void setName(@Nullable String val) {

@Override
public String toString() {
String playersS = String.format("%12s", Integer.toBinaryString(getPlayers()));
String playersS = String.format("%12s", _players);

playersS = playersS.substring(playersS.length() - 12).replaceAll(" ", "0");

Expand All @@ -1133,15 +1132,21 @@ public String toString() {
private void read_0x12(@Nonnull Wc3BinInputStream stream) throws BinInputStream.StreamException {
setFlags(Flags.valueOf(stream.readInt32("forceFlags")));

setPlayers(stream.readInt32("forcePlayers"));
long playersL = stream.readUInt32("forcePlayers");

BitSet players = BitSet.valueOf(new long[]{playersL});

setPlayers(players);

setName(stream.readString("forceName"));
}

private void write_0x12(@Nonnull Wc3BinOutputStream stream) {
stream.writeInt32(getFlags().toInt());

stream.writeInt32(getPlayers());
long playersL = _players.toLongArray().length != 0 ? _players.toLongArray()[0] : Long.parseLong("0", 2);

stream.writeUInt32(playersL);

stream.writeString(getName());
}
Expand Down Expand Up @@ -2353,7 +2358,7 @@ public FuncImpl makeInitCustomTeams() {
}

for (Force force : getForces()) {
for (Integer playerNum : force.getPlayerNums()) {
for (Integer playerNum : force.getPlayerNums(getPlayers())) {
Player player = numToPlayerMap.get(playerNum);

stmts.add(Statement.create("call SetPlayerTeam(Player(" + player.getNum() + ")" + ", " + getForces().indexOf(force) + ")"));
Expand Down