mirror of
https://github.com/Retera/WarsmashModEngine.git
synced 2022-07-31 17:38:59 +02:00
Update build and train to show requirements, also sRGB filter change for fun
This commit is contained in:
parent
780ed7b60b
commit
2c5c00d4ea
@ -18,7 +18,8 @@ Path04="."
|
||||
//FilePath="PrivateDontShare/Cult 8.w3x"
|
||||
//FilePath="TorchLight2.w3x"
|
||||
//FilePath="OrcAssault.w3x"
|
||||
FilePath="PeonStartingBase.w3x"
|
||||
//FilePath="PeonStartingBase.w3x"
|
||||
//FilePath="PhoenixAttack.w3x"
|
||||
//FilePath="OperationReforged.w3x"
|
||||
//FilePath="AzerothRoleplay1.909t03DecoratedV2.w3x"
|
||||
FilePath="American Colo EX 1.0 unpro.w3x"
|
||||
|
@ -218,7 +218,7 @@ public class WarsmashGdxMapGame extends ApplicationAdapter implements CanvasProv
|
||||
final String[] musics = musicField.split(";");
|
||||
String musicPath = musics[(int) (Math.random() * musics.length)];
|
||||
if (true) {
|
||||
musicPath = "Sound\\Music\\mp3Music\\DarkAgents.mp3";
|
||||
musicPath = "Sound\\Music\\mp3Music\\PH1.mp3";
|
||||
}
|
||||
final Music music = Gdx.audio.newMusic(
|
||||
new DataSourceFileHandle(WarsmashGdxMapGame.this.viewer.dataSource, musicPath));
|
||||
|
@ -58,7 +58,7 @@ public class FolderDataSource implements DataSource {
|
||||
if (!has(path)) {
|
||||
return null;
|
||||
}
|
||||
return ByteBuffer.wrap(Files.readAllBytes(Paths.get(path)));
|
||||
return ByteBuffer.wrap(Files.readAllBytes(Paths.get(this.folderPath.toString(), path)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -97,6 +97,7 @@ public class StringFrame extends AbstractRenderableFrame {
|
||||
final char escapedCharacter = this.text.charAt(i + 1);
|
||||
switch (escapedCharacter) {
|
||||
case 'c':
|
||||
case 'C':
|
||||
if ((i + 9) < this.text.length()) {
|
||||
int colorInt;
|
||||
try {
|
||||
@ -161,6 +162,7 @@ public class StringFrame extends AbstractRenderableFrame {
|
||||
}
|
||||
break;
|
||||
case 'r':
|
||||
case 'R':
|
||||
i++; {
|
||||
final String wordString = currentWord.toString();
|
||||
currentWord.setLength(0);
|
||||
@ -210,7 +212,8 @@ public class StringFrame extends AbstractRenderableFrame {
|
||||
}
|
||||
currentColor = this.color;
|
||||
break;
|
||||
case 'n': {
|
||||
case 'n':
|
||||
case 'N': {
|
||||
|
||||
final String wordString = currentWord.toString();
|
||||
currentWord.setLength(0);
|
||||
@ -344,6 +347,9 @@ public class StringFrame extends AbstractRenderableFrame {
|
||||
singleStringFrame.setHeight(this.frameFont.getLineHeight());
|
||||
singleStringFrame.setWidth(glyphLayout.width);
|
||||
singleStringFrame.setAlpha(this.alpha);
|
||||
singleStringFrame.setFontShadowColor(this.fontShadowColor);
|
||||
singleStringFrame.setFontShadowOffsetX(this.fontShadowOffsetX);
|
||||
singleStringFrame.setFontShadowOffsetY(this.fontShadowOffsetY);
|
||||
singleStringFrame.addAnchor(new AnchorDefinition(FramePoint.TOPLEFT, currentXCoordForFrames, -usedHeight));
|
||||
this.internalFrames.add(singleStringFrame);
|
||||
currentXCoordForFrames = currentXCoordForWord;
|
||||
|
@ -98,7 +98,7 @@ public final class ImageUtils {
|
||||
}
|
||||
|
||||
public boolean isNeedsSRGBFix() {
|
||||
return this.needsSRGBFix;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -217,6 +217,9 @@ public final class ImageUtils {
|
||||
* @return Resulting sRGB image.
|
||||
*/
|
||||
public static BufferedImage forceBufferedImagesRGB(final BufferedImage in) {
|
||||
if (true) {
|
||||
return in;
|
||||
}
|
||||
// Resolve input ColorSpace.
|
||||
final ColorSpace inCS = in.getColorModel().getColorSpace();
|
||||
final ColorSpace sRGBCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
||||
|
@ -91,7 +91,8 @@ public abstract class RawOpenGLTextureResource extends Texture {
|
||||
final GL20 gl = this.viewer.gl;
|
||||
}
|
||||
|
||||
public void update(final BufferedImage image, final boolean sRGBFix) {
|
||||
public void update(final BufferedImage image, boolean sRGBFix) {
|
||||
sRGBFix = false;
|
||||
final GL20 gl = this.viewer.gl;
|
||||
|
||||
final int imageWidth = image.getWidth();
|
||||
|
@ -57,7 +57,7 @@ public class WorldScene extends Scene {
|
||||
|
||||
// Update and collect all of the visible instances.
|
||||
for (final GridCell cell : this.grid.cells) {
|
||||
if (cell.isVisible(this.camera)) {
|
||||
if (cell.isVisible(this.camera) || true) {
|
||||
this.visibleCells += 1;
|
||||
|
||||
for (final ModelInstance instance : new ArrayList<>(cell.instances)) {
|
||||
|
@ -4,6 +4,7 @@ import java.util.EnumSet;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.math.Quaternion;
|
||||
import com.etheller.warsmash.parsers.fdf.GameUI;
|
||||
import com.etheller.warsmash.units.manager.MutableObjectData.MutableGameObject;
|
||||
import com.etheller.warsmash.util.RenderMathUtils;
|
||||
import com.etheller.warsmash.util.War3ID;
|
||||
@ -142,10 +143,11 @@ public class RenderUnit implements RenderWidget {
|
||||
|
||||
}
|
||||
|
||||
public void populateCommandCard(final CSimulation game, final CommandButtonListener commandButtonListener,
|
||||
final AbilityDataUI abilityDataUI, final int subMenuOrderId) {
|
||||
public void populateCommandCard(final CSimulation game, final GameUI gameUI,
|
||||
final CommandButtonListener commandButtonListener, final AbilityDataUI abilityDataUI,
|
||||
final int subMenuOrderId) {
|
||||
final CommandCardPopulatingAbilityVisitor commandCardPopulatingVisitor = CommandCardPopulatingAbilityVisitor.INSTANCE
|
||||
.reset(game, this.simulationUnit, commandButtonListener, abilityDataUI, subMenuOrderId);
|
||||
.reset(game, gameUI, this.simulationUnit, commandButtonListener, abilityDataUI, subMenuOrderId);
|
||||
for (final CAbility ability : this.simulationUnit.getAbilities()) {
|
||||
ability.visit(commandCardPopulatingVisitor);
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ public interface RenderWidget {
|
||||
private final EnumSet<AnimationTokens.SecondaryTag> recycleSet = EnumSet
|
||||
.noneOf(AnimationTokens.SecondaryTag.class);
|
||||
private PrimaryTag currentAnimation;
|
||||
private EnumSet<SecondaryTag> currentAnimationSecondaryTags;
|
||||
private EnumSet<SecondaryTag> currentAnimationSecondaryTags = SequenceUtils.EMPTY;
|
||||
private float currentSpeedRatio;
|
||||
private boolean currentlyAllowingRarityVariations;
|
||||
private final Queue<QueuedAnimation> animationQueue = new LinkedList<>();
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.etheller.warsmash.viewer5.handlers.w3x.rendersim.commandbuttons;
|
||||
|
||||
import com.etheller.warsmash.parsers.fdf.GameUI;
|
||||
import com.etheller.warsmash.util.War3ID;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.AbilityDataUI;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.ability.AbilityIconUI;
|
||||
@ -28,6 +29,8 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.queue.CAb
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.combat.attacks.CUnitAttack;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.orders.OrderIds;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.players.CPlayer;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.AbilityActivationReceiver;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.util.ResourceType;
|
||||
|
||||
public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void> {
|
||||
public static final CommandCardPopulatingAbilityVisitor INSTANCE = new CommandCardPopulatingAbilityVisitor();
|
||||
@ -38,11 +41,14 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
|
||||
private AbilityDataUI abilityDataUI;
|
||||
private int menuBaseOrderId;
|
||||
private boolean hasStop;
|
||||
private final CommandCardActivationReceiverPreviewCallback previewCallback = new CommandCardActivationReceiverPreviewCallback();
|
||||
private GameUI gameUI;
|
||||
|
||||
public CommandCardPopulatingAbilityVisitor reset(final CSimulation game, final CUnit unit,
|
||||
public CommandCardPopulatingAbilityVisitor reset(final CSimulation game, final GameUI gameUI, final CUnit unit,
|
||||
final CommandButtonListener commandButtonListener, final AbilityDataUI abilityDataUI,
|
||||
final int menuBaseOrderId) {
|
||||
this.game = game;
|
||||
this.gameUI = gameUI;
|
||||
this.unit = unit;
|
||||
this.commandButtonListener = commandButtonListener;
|
||||
this.abilityDataUI = abilityDataUI;
|
||||
@ -201,15 +207,26 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
|
||||
}
|
||||
|
||||
private void addCommandButton(final CAbility ability, final IconUI iconUI, final int handleId, final int orderId,
|
||||
final int autoCastOrderId, final boolean autoCastActive, final boolean menuButton, final int goldCost,
|
||||
final int lumberCost, final int foodCost) {
|
||||
final int autoCastOrderId, final boolean autoCastActive, final boolean menuButton, int goldCost,
|
||||
int lumberCost, int foodCost) {
|
||||
ability.checkCanUse(this.game, this.unit, orderId, this.previewCallback.reset());
|
||||
final boolean active = ((this.unit.getCurrentBehavior() != null)
|
||||
&& (orderId == this.unit.getCurrentBehavior().getHighlightOrderId()));
|
||||
final boolean disabled = (ability != null) && ability.isDisabled();
|
||||
final boolean disabled = ((ability != null) && ability.isDisabled()) || this.previewCallback.disabled;
|
||||
String uberTip = iconUI.getUberTip();
|
||||
if (disabled) {
|
||||
// dont show these on disabled
|
||||
goldCost = 0;
|
||||
lumberCost = 0;
|
||||
foodCost = 0;
|
||||
}
|
||||
if (this.previewCallback.isShowingRequirements()) {
|
||||
uberTip = this.previewCallback.getRequirementsText() + "|r" + uberTip;
|
||||
}
|
||||
this.commandButtonListener.commandButton(iconUI.getButtonPositionX(), iconUI.getButtonPositionY(),
|
||||
disabled ? iconUI.getIconDisabled() : iconUI.getIcon(), handleId, disabled ? 0 : orderId,
|
||||
autoCastOrderId, active, autoCastActive, menuButton, iconUI.getToolTip(), iconUI.getUberTip(), goldCost,
|
||||
lumberCost, foodCost);
|
||||
autoCastOrderId, active, autoCastActive, menuButton, iconUI.getToolTip(), uberTip, goldCost, lumberCost,
|
||||
foodCost);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -247,4 +264,69 @@ public class CommandCardPopulatingAbilityVisitor implements CAbilityVisitor<Void
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private final class CommandCardActivationReceiverPreviewCallback implements AbilityActivationReceiver {
|
||||
private boolean disabled;
|
||||
private final StringBuilder requirementsTextBuilder = new StringBuilder();
|
||||
|
||||
public CommandCardActivationReceiverPreviewCallback reset() {
|
||||
this.disabled = false;
|
||||
this.requirementsTextBuilder.setLength(0);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void useOk() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notEnoughResources(final ResourceType resource) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notAnActiveAbility() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void missingRequirement(final War3ID type, final int level) {
|
||||
this.disabled = true;
|
||||
if (this.requirementsTextBuilder.length() == 0) {
|
||||
this.requirementsTextBuilder.append(CommandCardPopulatingAbilityVisitor.this.gameUI.getTemplates()
|
||||
.getDecoratedString("REQUIRESTOOLTIP"));
|
||||
this.requirementsTextBuilder.append("|n - ");
|
||||
}
|
||||
else {
|
||||
this.requirementsTextBuilder.append(" - ");
|
||||
}
|
||||
final CUnitType unitType = CommandCardPopulatingAbilityVisitor.this.game.getUnitData().getUnitType(type);
|
||||
this.requirementsTextBuilder
|
||||
.append(unitType == null ? "NOTEXTERN Unknown ('" + type + "')" : unitType.getName());
|
||||
this.requirementsTextBuilder.append("|n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void casterMovementDisabled() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cargoCapacityUnavailable() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disabled() {
|
||||
this.disabled = true;
|
||||
}
|
||||
|
||||
public boolean isShowingRequirements() {
|
||||
return this.requirementsTextBuilder.length() != 0;
|
||||
}
|
||||
|
||||
public String getRequirementsText() {
|
||||
return this.requirementsTextBuilder.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -279,6 +279,8 @@ public class CSimulation {
|
||||
}
|
||||
|
||||
public void unitConstructFinishEvent(final CUnit constructedStructure) {
|
||||
final CPlayer player = getPlayer(constructedStructure.getPlayerIndex());
|
||||
player.addTechtreeUnlocked(constructedStructure.getTypeId());
|
||||
this.simulationRenderController.spawnUnitConstructionFinishSound(constructedStructure);
|
||||
}
|
||||
|
||||
@ -310,6 +312,7 @@ public class CSimulation {
|
||||
final CPlayer player = this.players.get(unit.getPlayerIndex());
|
||||
player.setUnitFoodUsed(unit, unit.getUnitType().getFoodUsed());
|
||||
player.setUnitFoodMade(unit, unit.getUnitType().getFoodMade());
|
||||
player.addTechtreeUnlocked(unit.getTypeId());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -236,6 +236,9 @@ public class CUnit extends CWidget {
|
||||
}
|
||||
}
|
||||
else if (!this.paused) {
|
||||
if ((this.rallyPoint != this) && (this.rallyPoint instanceof CUnit) && ((CUnit) this.rallyPoint).isDead()) {
|
||||
setRallyPoint(this);
|
||||
}
|
||||
if (this.constructing) {
|
||||
this.constructionProgress += WarsmashConstants.SIMULATION_STEP_TIME;
|
||||
final int buildTime = this.unitType.getBuildTime();
|
||||
@ -296,8 +299,9 @@ public class CUnit extends CWidget {
|
||||
game.getGameplayConstants().getBuildingAngle());
|
||||
// dont add food cost to player 2x
|
||||
trainedUnit.setFoodUsed(trainedUnitType.getFoodUsed());
|
||||
game.getPlayer(this.playerIndex).setUnitFoodMade(trainedUnit,
|
||||
trainedUnitType.getFoodMade());
|
||||
final CPlayer player = game.getPlayer(this.playerIndex);
|
||||
player.setUnitFoodMade(trainedUnit, trainedUnitType.getFoodMade());
|
||||
player.addTechtreeUnlocked(queuedRawcode);
|
||||
// nudge the trained unit out around us
|
||||
trainedUnit.nudgeAround(game, this);
|
||||
game.unitTrainedEvent(this, trainedUnit);
|
||||
|
@ -57,6 +57,7 @@ public class CUnitType {
|
||||
private final EnumSet<CBuildingPathingType> requiredPathingTypes;
|
||||
private final float propWindow;
|
||||
private final float turnRate;
|
||||
private final List<CUnitTypeRequirement> requirements;
|
||||
|
||||
public CUnitType(final String name, final int life, final int manaInitial, final int manaMaximum, final int speed,
|
||||
final int defense, final String abilityList, final boolean isBldg, final MovementType movementType,
|
||||
@ -68,7 +69,8 @@ public class CUnitType {
|
||||
final List<War3ID> unitsTrained, final List<War3ID> researchesAvailable, final CUnitRace unitRace,
|
||||
final int goldCost, final int lumberCost, final int foodUsed, final int foodMade, final int buildTime,
|
||||
final EnumSet<CBuildingPathingType> preventedPathingTypes,
|
||||
final EnumSet<CBuildingPathingType> requiredPathingTypes, final float propWindow, final float turnRate) {
|
||||
final EnumSet<CBuildingPathingType> requiredPathingTypes, final float propWindow, final float turnRate,
|
||||
final List<CUnitTypeRequirement> requirements) {
|
||||
this.name = name;
|
||||
this.life = life;
|
||||
this.manaInitial = manaInitial;
|
||||
@ -105,6 +107,7 @@ public class CUnitType {
|
||||
this.requiredPathingTypes = requiredPathingTypes;
|
||||
this.propWindow = propWindow;
|
||||
this.turnRate = turnRate;
|
||||
this.requirements = requirements;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
@ -250,4 +253,8 @@ public class CUnitType {
|
||||
public float getTurnRate() {
|
||||
return this.turnRate;
|
||||
}
|
||||
|
||||
public List<CUnitTypeRequirement> getRequirements() {
|
||||
return this.requirements;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,21 @@
|
||||
package com.etheller.warsmash.viewer5.handlers.w3x.simulation;
|
||||
|
||||
import com.etheller.warsmash.util.War3ID;
|
||||
|
||||
public class CUnitTypeRequirement {
|
||||
private final War3ID requirement;
|
||||
private final int requiredLevel;
|
||||
|
||||
public CUnitTypeRequirement(final War3ID requirement, final int requiredLevel) {
|
||||
this.requirement = requirement;
|
||||
this.requiredLevel = requiredLevel;
|
||||
}
|
||||
|
||||
public War3ID getRequirement() {
|
||||
return this.requirement;
|
||||
}
|
||||
|
||||
public int getRequiredLevel() {
|
||||
return this.requiredLevel;
|
||||
}
|
||||
}
|
@ -9,6 +9,7 @@ import com.etheller.warsmash.util.War3ID;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitType;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitTypeRequirement;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CWidget;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.AbstractCAbility;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.menu.CAbilityMenu;
|
||||
@ -39,10 +40,19 @@ public abstract class AbstractCAbilityBuild extends AbstractCAbility implements
|
||||
final CUnitType unitType = game.getUnitData().getUnitType(orderIdAsRawtype);
|
||||
if (unitType != null) {
|
||||
final CPlayer player = game.getPlayer(unit.getPlayerIndex());
|
||||
final List<CUnitTypeRequirement> requirements = unitType.getRequirements();
|
||||
boolean requirementsMet = true;
|
||||
for (final CUnitTypeRequirement requirement : requirements) {
|
||||
if (player.getTechtreeUnlocked(requirement.getRequirement()) < requirement.getRequiredLevel()) {
|
||||
requirementsMet = false;
|
||||
}
|
||||
}
|
||||
if (requirementsMet) {
|
||||
if (player.getGold() >= unitType.getGoldCost()) {
|
||||
if (player.getLumber() >= unitType.getLumberCost()) {
|
||||
if ((unitType.getFoodUsed() == 0)
|
||||
|| ((player.getFoodUsed() + unitType.getFoodUsed()) <= player.getFoodCap())) {
|
||||
|
||||
receiver.useOk();
|
||||
}
|
||||
else {
|
||||
@ -57,6 +67,12 @@ public abstract class AbstractCAbilityBuild extends AbstractCAbility implements
|
||||
receiver.notEnoughResources(ResourceType.GOLD);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (final CUnitTypeRequirement requirement : requirements) {
|
||||
receiver.missingRequirement(requirement.getRequirement(), requirement.getRequiredLevel());
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
receiver.useOk();
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import com.etheller.warsmash.util.War3ID;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitType;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitTypeRequirement;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CWidget;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.AbstractCAbility;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbilityVisitor;
|
||||
@ -45,6 +46,14 @@ public final class CAbilityQueue extends AbstractCAbility {
|
||||
final CUnitType unitType = game.getUnitData().getUnitType(orderIdAsRawtype);
|
||||
if (unitType != null) {
|
||||
final CPlayer player = game.getPlayer(unit.getPlayerIndex());
|
||||
final List<CUnitTypeRequirement> requirements = unitType.getRequirements();
|
||||
boolean requirementsMet = true;
|
||||
for (final CUnitTypeRequirement requirement : requirements) {
|
||||
if (player.getTechtreeUnlocked(requirement.getRequirement()) < requirement.getRequiredLevel()) {
|
||||
requirementsMet = false;
|
||||
}
|
||||
}
|
||||
if (requirementsMet) {
|
||||
if (player.getGold() >= unitType.getGoldCost()) {
|
||||
if (player.getLumber() >= unitType.getLumberCost()) {
|
||||
if ((unitType.getFoodUsed() == 0)
|
||||
@ -63,6 +72,12 @@ public final class CAbilityQueue extends AbstractCAbility {
|
||||
receiver.notEnoughResources(ResourceType.GOLD);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (final CUnitTypeRequirement requirement : requirements) {
|
||||
receiver.missingRequirement(requirement.getRequirement(), requirement.getRequiredLevel());
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
receiver.useOk();
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ public class CAbilityRally extends AbstractCAbility {
|
||||
|
||||
@Override
|
||||
public void onAdd(final CSimulation game, final CUnit unit) {
|
||||
|
||||
unit.setRallyPoint(unit);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -92,8 +92,13 @@ public class CBehaviorHarvest extends CAbstractRangedBehavior
|
||||
}
|
||||
}
|
||||
// weird invalid target and we have no resources, consider harvesting done
|
||||
if (this.abilityHarvest.getCarriedResourceAmount() == 0) {
|
||||
return this.unit.pollNextOrderBehavior(this.simulation);
|
||||
}
|
||||
else {
|
||||
return this.abilityHarvest.getBehaviorReturnResources().reset(this.simulation);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// we have some GOLD and we're not in a mine (?) lets do a return resources
|
||||
// order
|
||||
|
@ -16,6 +16,7 @@ import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CSimulation;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnit;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitClassification;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitType;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.CUnitTypeRequirement;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.HandleIdAllocator;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbility;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.simulation.abilities.CAbilityAttack;
|
||||
@ -137,6 +138,9 @@ public class CUnitData {
|
||||
private static final War3ID RESEARCHES_AVAILABLE = War3ID.fromString("ures");
|
||||
private static final War3ID UNIT_RACE = War3ID.fromString("urac");
|
||||
|
||||
private static final War3ID REQUIRES = War3ID.fromString("ureq");
|
||||
private static final War3ID REQUIRES_AMOUNT = War3ID.fromString("urqc");
|
||||
|
||||
private static final War3ID GOLD_COST = War3ID.fromString("ugol");
|
||||
private static final War3ID LUMBER_COST = War3ID.fromString("ulum");
|
||||
private static final War3ID BUILD_TIME = War3ID.fromString("ubld");
|
||||
@ -416,6 +420,40 @@ public class CUnitData {
|
||||
}
|
||||
}
|
||||
|
||||
final String requirementsString = unitType.getFieldAsString(REQUIRES, 0);
|
||||
final String requirementsLevelsString = unitType.getFieldAsString(REQUIRES_AMOUNT, 0);
|
||||
final String[] requirementsStringItems = requirementsString.split(",");
|
||||
final String[] requirementsLevelsStringItems = requirementsLevelsString.split(",");
|
||||
final List<CUnitTypeRequirement> requirements = new ArrayList<>();
|
||||
for (int i = 0; i < requirementsStringItems.length; i++) {
|
||||
final String item = requirementsStringItems[i];
|
||||
if (!item.isEmpty()) {
|
||||
int level;
|
||||
if (i < requirementsLevelsStringItems.length) {
|
||||
if (requirementsLevelsStringItems[i].isEmpty()) {
|
||||
level = 1;
|
||||
}
|
||||
else {
|
||||
level = Integer.parseInt(requirementsLevelsStringItems[i]);
|
||||
}
|
||||
}
|
||||
else if (requirementsLevelsStringItems.length > 0) {
|
||||
final String requirementLevel = requirementsLevelsStringItems[requirementsLevelsStringItems.length
|
||||
- 1];
|
||||
if (requirementLevel.isEmpty()) {
|
||||
level = 1;
|
||||
}
|
||||
else {
|
||||
level = Integer.parseInt(requirementLevel);
|
||||
}
|
||||
}
|
||||
else {
|
||||
level = 1;
|
||||
}
|
||||
requirements.add(new CUnitTypeRequirement(War3ID.fromString(item), level));
|
||||
}
|
||||
}
|
||||
|
||||
final EnumSet<CBuildingPathingType> preventedPathingTypes = CBuildingPathingType
|
||||
.parsePathingTypeListSet(unitType.getFieldAsString(PREVENT_PLACE, 0));
|
||||
final EnumSet<CBuildingPathingType> requiredPathingTypes = CBuildingPathingType
|
||||
@ -429,7 +467,7 @@ public class CUnitData {
|
||||
defenseType, impactZ, buildingPathingPixelMap, deathTime, targetedAs, acquisitionRange,
|
||||
minimumAttackRange, structuresBuilt, unitsTrained, researchesAvailable, unitRace, goldCost,
|
||||
lumberCost, foodUsed, foodMade, buildTime, preventedPathingTypes, requiredPathingTypes, propWindow,
|
||||
turnRate);
|
||||
turnRate, requirements);
|
||||
this.unitIdToUnitType.put(typeId, unitTypeInstance);
|
||||
}
|
||||
return unitTypeInstance;
|
||||
|
@ -150,6 +150,26 @@ public class CPlayer {
|
||||
return techtreeUnlocked;
|
||||
}
|
||||
|
||||
public void addTechtreeUnlocked(final War3ID rawcode) {
|
||||
final Integer techtreeUnlocked = this.rawcodeToTechtreeUnlocked.get(rawcode);
|
||||
if (techtreeUnlocked == null) {
|
||||
this.rawcodeToTechtreeUnlocked.put(rawcode, 1);
|
||||
}
|
||||
else {
|
||||
this.rawcodeToTechtreeUnlocked.put(rawcode, techtreeUnlocked + 1);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeTechtreeUnlocked(final War3ID rawcode) {
|
||||
final Integer techtreeUnlocked = this.rawcodeToTechtreeUnlocked.get(rawcode);
|
||||
if (techtreeUnlocked == null) {
|
||||
this.rawcodeToTechtreeUnlocked.put(rawcode, -1);
|
||||
}
|
||||
else {
|
||||
this.rawcodeToTechtreeUnlocked.put(rawcode, techtreeUnlocked - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public void addStateListener(final CPlayerStateListener listener) {
|
||||
this.stateNotifier.subscribe(listener);
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.util;
|
||||
|
||||
import com.etheller.warsmash.util.War3ID;
|
||||
|
||||
public interface AbilityActivationReceiver {
|
||||
void useOk();
|
||||
|
||||
@ -7,7 +9,7 @@ public interface AbilityActivationReceiver {
|
||||
|
||||
void notAnActiveAbility();
|
||||
|
||||
void missingRequirement(String name);
|
||||
void missingRequirement(War3ID type, int level);
|
||||
|
||||
void casterMovementDisabled();
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.util;
|
||||
|
||||
import com.etheller.warsmash.util.War3ID;
|
||||
|
||||
public class BooleanAbilityActivationReceiver implements AbilityActivationReceiver {
|
||||
public static final BooleanAbilityActivationReceiver INSTANCE = new BooleanAbilityActivationReceiver();
|
||||
private boolean ok;
|
||||
@ -20,7 +22,7 @@ public class BooleanAbilityActivationReceiver implements AbilityActivationReceiv
|
||||
}
|
||||
|
||||
@Override
|
||||
public void missingRequirement(final String name) {
|
||||
public void missingRequirement(final War3ID type, final int level) {
|
||||
this.ok = false;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.util;
|
||||
|
||||
import com.etheller.warsmash.util.War3ID;
|
||||
import com.etheller.warsmash.viewer5.AudioContext;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.rendersim.RenderUnit;
|
||||
import com.etheller.warsmash.viewer5.handlers.w3x.ui.command.CommandErrorListener;
|
||||
@ -59,7 +60,7 @@ public class MeleeUIAbilityActivationReceiver implements AbilityActivationReceiv
|
||||
}
|
||||
|
||||
@Override
|
||||
public void missingRequirement(final String name) {
|
||||
public void missingRequirement(final War3ID type, final int level) {
|
||||
this.genericError.onClick(this.commandErrorListener, this.worldSceneAudioContext, this.commandedUnit);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.etheller.warsmash.viewer5.handlers.w3x.simulation.util;
|
||||
|
||||
import com.etheller.warsmash.util.War3ID;
|
||||
|
||||
public class StringMsgAbilityActivationReceiver implements AbilityActivationReceiver {
|
||||
private String message;
|
||||
private boolean useOk = false;
|
||||
@ -34,8 +36,8 @@ public class StringMsgAbilityActivationReceiver implements AbilityActivationRece
|
||||
}
|
||||
|
||||
@Override
|
||||
public void missingRequirement(final String name) {
|
||||
this.message = "NOTEXTERN: Requires " + name;
|
||||
public void missingRequirement(final War3ID type, final int level) {
|
||||
this.message = "NOTEXTERN: Requires " + type;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -418,7 +418,7 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
|
||||
this.unitManaText = (StringFrame) this.rootFrame.getFrameByName("UnitPortraitManaPointText", 0);
|
||||
|
||||
final float infoPanelUnitDetailWidth = GameUI.convertY(this.uiViewport, 0.180f);
|
||||
final float infoPanelUnitDetailHeight = GameUI.convertY(this.uiViewport, 0.105f);
|
||||
final float infoPanelUnitDetailHeight = GameUI.convertY(this.uiViewport, 0.110f);
|
||||
this.smashSimpleInfoPanel = this.rootFrame.createSimpleFrame("SmashSimpleInfoPanel", this.rootFrame, 0);
|
||||
this.smashSimpleInfoPanel
|
||||
.addAnchor(new AnchorDefinition(FramePoint.BOTTOM, 0, GameUI.convertY(this.uiViewport, 0.0f)));
|
||||
@ -556,7 +556,7 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
|
||||
new Color(0xFFCC00FF), TextJustify.LEFT, TextJustify.MIDDLE, worldFrameMessageFontHeight);
|
||||
this.errorMessageFrame.addAnchor(new AnchorDefinition(FramePoint.BOTTOMLEFT,
|
||||
GameUI.convertX(this.uiViewport, 0.212f), GameUI.convertY(this.uiViewport, 0.182f)));
|
||||
this.errorMessageFrame.setWidth(GameUI.convertX(this.uiViewport, 0.25f));
|
||||
this.errorMessageFrame.setWidth(GameUI.convertX(this.uiViewport, 0.35f));
|
||||
this.errorMessageFrame.setHeight(GameUI.convertY(this.uiViewport, worldFrameMessageFontHeight));
|
||||
|
||||
this.errorMessageFrame.setFontShadowColor(new Color(0f, 0f, 0f, 0.9f));
|
||||
@ -1773,7 +1773,8 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
|
||||
this.commandButton(cancelUI.getButtonPositionX(), cancelUI.getButtonPositionY(), cancelUI.getIcon(), 0,
|
||||
exitOrderId, 0, false, false, true, cancelUI.getToolTip(), cancelUI.getUberTip(), 0, 0, 0);
|
||||
}
|
||||
this.selectedUnit.populateCommandCard(this.war3MapViewer.simulation, this, abilityDataUI, menuOrderId);
|
||||
this.selectedUnit.populateCommandCard(this.war3MapViewer.simulation, this.rootFrame, this, abilityDataUI,
|
||||
menuOrderId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1941,10 +1942,12 @@ public class MeleeUI implements CUnitStateListener, CommandButtonListener, Comma
|
||||
else {
|
||||
final List<RenderWidget> selectedUnits = this.war3MapViewer.selectUnit(screenX, worldScreenY,
|
||||
false);
|
||||
if (!selectedUnits.isEmpty()) {
|
||||
selectWidgets(selectedUnits);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (clickedUIFrame instanceof ClickableActionFrame) {
|
||||
this.mouseDownUIFrame = (ClickableActionFrame) clickedUIFrame;
|
||||
|
@ -31,13 +31,13 @@ Frame "SIMPLEFRAME" "UnitPortrait" {
|
||||
}
|
||||
|
||||
String "UnitPortraitHitPointText" INHERITS "UnitPortraitTextTemplate" {
|
||||
Anchor BOTTOM, 0, 0.0115,
|
||||
Anchor BOTTOM, 0, 0.014,
|
||||
FontJustificationH JUSTIFYCENTER,
|
||||
FontColor 0.0 1.0 0.0 1.0,
|
||||
}
|
||||
|
||||
String "UnitPortraitManaPointText" INHERITS "UnitPortraitTextTemplate" {
|
||||
Anchor BOTTOM, 0, -0.0030,
|
||||
Anchor BOTTOM, 0, -0.0005,
|
||||
FontJustificationH JUSTIFYCENTER,
|
||||
FontColor 1.0 1.0 1.0 1.0,
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user