Compare commits

..

25 Commits

Author SHA1 Message Date
Paul Chote
b73210f706 Merge branch 'gh-actions' into devtest-integration 2020-12-07 00:14:58 +00:00
Paul Chote
a111f1299c 18892 (pchote edition) 2020-12-07 00:14:53 +00:00
Paul Chote
d21e52b33c Merge remote-tracking branch 'upstream/pr/18900' into devtest-integration 2020-12-07 00:11:51 +00:00
Paul Chote
4e6912a22c Merge remote-tracking branch 'upstream/pr/18894' into devtest-integration 2020-12-07 00:11:43 +00:00
Paul Chote
80c2ac1350 Merge remote-tracking branch 'upstream/pr/18695' into devtest-integration 2020-12-07 00:10:10 +00:00
Paul Chote
776894445b Merge remote-tracking branch 'upstream/pr/18678' into devtest-integration 2020-12-07 00:09:58 +00:00
Paul Chote
a4369dc804 Merge remote-tracking branch 'upstream/pr/18430' into devtest-integration 2020-12-07 00:09:40 +00:00
Paul Chote
ae35880900 Merge remote-tracking branch 'upstream/pr/18903' into devtest-integration 2020-12-07 00:09:27 +00:00
Paul Chote
9900dc47d2 Merge remote-tracking branch 'upstream/pr/18874' into devtest-integration 2020-12-07 00:09:20 +00:00
Paul Chote
4d251d6fc3 Merge remote-tracking branch 'upstream/pr/18902' into devtest-integration 2020-12-07 00:08:53 +00:00
Paul Chote
e226eb2ae5 Merge remote-tracking branch 'upstream/pr/18904' into devtest-integration 2020-12-07 00:08:39 +00:00
Paul Chote
cf2d4b24e2 Fix Neutral crushing checks. 2020-12-07 00:01:35 +00:00
Paul Chote
a160797f71 Fix TD SAM Site facings being reset when damaged while closed. 2020-12-06 22:45:18 +00:00
Paul Chote
baed329f21 Fix restart black screen race condition. 2020-12-06 21:42:42 +00:00
Paul Chote
7c96b69303 Ignore aircraft when searching for enemy targets. 2020-12-06 18:18:05 +00:00
Paul Chote
2b50d99a62 Exclude carryalls from AI squads. 2020-12-06 18:06:57 +00:00
Paul Chote
f0d910357d Abort squad states that are not able to move. 2020-12-06 18:05:55 +00:00
Paul Chote
4c113fd7b6 Migrate CI and packaging from Travis CI to GitHub Actions. 2020-12-06 16:37:05 +00:00
Paul Chote
b690157c5b Fix rally point target line exit display. 2020-12-05 13:30:52 +00:00
Paul Chote
e29d52d9dc Add DisplayFaction details to the replay metadata. 2020-11-29 18:00:15 +00:00
yuantse
b4e6b3fd6f Add Allies 09a 2020-11-15 11:44:52 +08:00
Smittytron
7903f7bd4b Add Counterstrike mission Sarin Gas 3: Controlled Burn 2020-11-14 12:56:15 -06:00
abcdefg30
ccc639ad22 Add an update rule 2020-11-14 13:11:29 +01:00
abcdefg30
6b563c8170 Update the rules of the default mods 2020-11-14 13:11:26 +01:00
abcdefg30
07fdcbb140 Rename Stances to Relationships in the yaml api 2020-11-14 13:10:09 +01:00
126 changed files with 789 additions and 3392 deletions

View File

@@ -2,13 +2,14 @@ name: Continuous Integration
on:
push:
workflow_dispatch:
pull_request:
branches: [ bleed ]
jobs:
linux-mono:
name: Linux (mono)
runs-on: ubuntu-20.04
runs-on: ubuntu-16.04
steps:
- name: Clone Repository
@@ -37,7 +38,6 @@ jobs:
- name: Check Code
shell: powershell
run: |
dotnet nuget locals all --clear
.\make.ps1 check
Invoke-Expression "$home\.nuget\packages\nunit.consolerunner\3.11.1\tools\nunit3-console.exe --noresult bin/OpenRA.Test.dll"

View File

@@ -1,107 +0,0 @@
name: Deploy Documentation
on:
workflow_dispatch:
inputs:
tag:
description: 'Git Tag'
required: true
default: 'release-xxxxxxxx'
jobs:
wiki:
name: Update Wiki
if: github.repository == 'openra/openra'
runs-on: ubuntu-20.04
steps:
- name: Clone Repository
uses: actions/checkout@v2
with:
ref: ${{ github.event.inputs.tag }}
- name: Prepare Environment
run: |
make all
- name: Clone Wiki
uses: actions/checkout@v2
with:
repository: openra/openra.wiki
token: ${{ secrets.DOCS_TOKEN }}
path: wiki
- name: Update Wiki (Playtest)
if: startsWith(github.event.inputs.tag, 'playtest-')
env:
GIT_TAG: ${{ github.event.inputs.tag }}
run: |
./utility.sh all --settings-docs "${GIT_TAG}" > "wiki/Settings (playtest).md"
- name: Update Wiki (Release)
if: startsWith(github.event.inputs.tag, 'release-')
env:
GIT_TAG: ${{ github.event.inputs.tag }}
run: |
./utility.sh all --settings-docs "${GIT_TAG}" > "wiki/Settings.md"
- name: Push Wiki
env:
GIT_TAG: ${{ github.event.inputs.tag }}
run: |
cd wiki
git config --local user.email "actions@github.com"
git config --local user.name "GitHub Actions"
git add --all
git commit -m "Update auto-generated documentation for ${GIT_TAG}"
git push origin master
docs:
name: Update docs.openra.net
if: github.repository == 'openra/openra'
runs-on: ubuntu-20.04
steps:
- name: Clone Repository
uses: actions/checkout@v2
with:
ref: ${{ github.event.inputs.tag }}
- name: Prepare Environment
run: |
make all
- name: Clone docs.openra.net
uses: actions/checkout@v2
with:
repository: openra/docs
token: ${{ secrets.DOCS_TOKEN }}
path: docs
- name: Update docs.openra.net (Playtest)
if: startsWith(github.event.inputs.tag, 'playtest-')
env:
GIT_TAG: ${{ github.event.inputs.tag }}
run: |
./utility.sh all --docs "${GIT_TAG}" > "docs/api/playtest/traits.md"
./utility.sh all --weapon-docs "${GIT_TAG}" > "docs/api/playtest/weapons.md"
./utility.sh all --lua-docs "${GIT_TAG}" > "docs/api/playtest/lua.md"
- name: Update docs.openra.net (Release)
if: startsWith(github.event.inputs.tag, 'release-')
env:
GIT_TAG: ${{ github.event.inputs.tag }}
run: |
./utility.sh all --docs "${GIT_TAG}" > "docs/api/release/traits.md"
./utility.sh all --weapon-docs "${GIT_TAG}" > "docs/api/release/weapons.md"
./utility.sh all --lua-docs "${GIT_TAG}" > "docs/api/release/lua.md"
- name: Push docs.openra.net
env:
GIT_TAG: ${{ github.event.inputs.tag }}
run: |
cd docs
git config --local user.email "actions@github.com"
git config --local user.name "GitHub Actions"
git add --all
git commit -m "Update auto-generated documentation for ${GIT_TAG}"
git push origin master

View File

@@ -1,86 +0,0 @@
name: Deploy itch.io Packages
on:
workflow_dispatch:
inputs:
tag:
description: 'Git Tag'
required: true
default: 'release-xxxxxxxx'
jobs:
itch:
name: Deploy to itch.io
runs-on: ubuntu-20.04
if: github.repository == 'openra/openra'
steps:
- name: Download Packages
run: |
wget -q "https://github.com/${{ github.repository }}/releases/download/${{ github.event.inputs.tag }}/OpenRA-${{ github.event.inputs.tag }}-x64.exe"
wget -q "https://github.com/${{ github.repository }}/releases/download/${{ github.event.inputs.tag }}/OpenRA-${{ github.event.inputs.tag }}-x64-winportable.zip" -O "OpenRA-${{ github.event.inputs.tag }}-x64-win-itch.zip"
wget -q "https://github.com/${{ github.repository }}/releases/download/${{ github.event.inputs.tag }}/OpenRA-${{ github.event.inputs.tag }}.dmg"
wget -q "https://github.com/${{ github.repository }}/releases/download/${{ github.event.inputs.tag }}/OpenRA-Dune-2000-x86_64.AppImage"
wget -q "https://github.com/${{ github.repository }}/releases/download/${{ github.event.inputs.tag }}/OpenRA-Red-Alert-x86_64.AppImage"
wget -q "https://github.com/${{ github.repository }}/releases/download/${{ github.event.inputs.tag }}/OpenRA-Tiberian-Dawn-x86_64.AppImage"
wget -q "https://raw.githubusercontent.com/${{ github.repository }}/${{ github.event.inputs.tag }}/packaging/.itch.toml"
zip -u "OpenRA-${{ github.event.inputs.tag }}-x64-win-itch.zip" .itch.toml
- name: Publish Windows Installer
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: win
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ github.event.inputs.tag }}
PACKAGE: OpenRA-${{ github.event.inputs.tag }}}-x64.exe
- name: Publish Windows Itch Bundle
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: itch
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ github.event.inputs.tag }}
PACKAGE: OpenRA-${{ github.event.inputs.tag }}-x64-win-itch.zip
- name: Publish macOS Package
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: macos
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ github.event.inputs.tag }}
PACKAGE: OpenRA-${{ github.event.inputs.tag }}}.dmg
- name: Publish RA AppImage
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: linux-ra
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ github.event.inputs.tag }}
PACKAGE: OpenRA-Red-Alert-x86_64.AppImage
- name: Publish TD AppImage
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: linux-cnc
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ github.event.inputs.tag }}
PACKAGE: OpenRA-Tiberian-Dawn-x86_64.AppImage
- name: Publish D2k AppImage
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: linux-d2k
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ github.event.inputs.tag }}
PACKAGE: OpenRA-Dune-2000-x86_64.AppImage

View File

@@ -8,33 +8,9 @@ on:
- 'devtest-*'
jobs:
source:
name: Source Tarball
runs-on: ubuntu-20.04
steps:
- name: Clone Repository
uses: actions/checkout@v2
- name: Prepare Environment
run: echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV}
- name: Package Source
run: |
mkdir -p build/source
./packaging/source/buildpackage.sh "${GIT_TAG}" "${PWD}/build/source"
- name: Upload Packages
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ github.ref }}
overwrite: true
file_glob: true
file: build/source/*
linux:
name: Linux AppImages
runs-on: ubuntu-20.04
runs-on: ubuntu-16.04
steps:
- name: Clone Repository
uses: actions/checkout@v2
@@ -88,7 +64,7 @@ jobs:
windows:
name: Windows Installers
runs-on: ubuntu-20.04
runs-on: ubuntu-16.04
steps:
- name: Clone Repository
uses: actions/checkout@v2
@@ -96,8 +72,10 @@ jobs:
- name: Prepare Environment
run: |
echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV}
sudo apt-get update
sudo apt-get install nsis
wget https://mirrors.edge.kernel.org/ubuntu/pool/universe/n/nsis/nsis-common_3.04-1_all.deb
wget https://mirrors.edge.kernel.org/ubuntu/pool/universe/n/nsis/nsis_3.04-1_amd64.deb
sudo dpkg -i nsis-common_3.04-1_all.deb
sudo dpkg -i nsis_3.04-1_amd64.deb
- name: Package Installers
run: |
@@ -112,3 +90,155 @@ jobs:
overwrite: true
file_glob: true
file: build/windows/*
itch:
name: Deploy to itch.io
runs-on: ubuntu-16.04
if: github.repository == 'openra/openra' && startsWith(github.ref, 'refs/tags/release-')
needs: [linux, macos, windows]
steps:
- name: Prepare Environment
run: |
echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV}
- name: Download Packages
run: |
wget -q "https://github.com/${{ github.repository }}/releases/download/${GIT_TAG}/OpenRA-${GIT_TAG}-x64.exe"
wget -q "https://github.com/${{ github.repository }}/releases/download/${GIT_TAG}/OpenRA-${GIT_TAG}-x64-winportable.zip" -O "OpenRA-${GIT_TAG}-x64-win-itch.zip"
wget -q "https://github.com${{ github.repository }}/releases/download/${GIT_TAG}/OpenRA-${GIT_TAG}.dmg"
wget -q "https://github.com/${{ github.repository }}/releases/download/${GIT_TAG}/OpenRA-Dune-2000-x86_64.AppImage"
wget -q "https://github.com/${{ github.repository }}/releases/download/${GIT_TAG}/OpenRA-Red-Alert-x86_64.AppImage"
wget -q "https://github.com/${{ github.repository }}/releases/download/${GIT_TAG}/OpenRA-Tiberian-Dawn-x86_64.AppImage"
wget -q "https://raw.githubusercontent.com/${{ github.repository }}/${GIT_TAG}/packaging/.itch.toml"
zip -u "OpenRA-${GIT_TAG}-x64-win-itch.zip" .itch.toml
- name: Publish Windows Installer
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: win
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ env.GIT_TAG }}
PACKAGE: OpenRA-${{ env.GIT_TAG }}}-x64.exe"
- name: Publish Windows Itch Bundle
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: itch
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ env.GIT_TAG }}
PACKAGE: OpenRA-${{ env.GIT_TAG }}-x64-win-itch.zip
- name: Publish macOS Package
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: macos
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ env.GIT_TAG }}
PACKAGE: OpenRA-${{ env.GIT_TAG }}}.dmg"
- name: Publish RA AppImage
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: linux-ra
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ env.GIT_TAG }}
PACKAGE: OpenRA-Red-Alert-x86_64.AppImage
- name: Publish TD AppImage
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: linux-cnc
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ env.GIT_TAG }}
PACKAGE: OpenRA-Tiberian-Dawn-x86_64.AppImage
- name: Publish D2k AppImage
uses: josephbmanley/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: linux-d2k
ITCH_GAME: openra
ITCH_USER: openra-developers
VERSION: ${{ env.GIT_TAG }}
PACKAGE: OpenRA-Dune-2000-x86_64.AppImage
docs:
name: Update Docs
if: github.repository == 'openra/openra' && (startsWith(github.ref, 'refs/tags/playtest-') || startsWith(github.ref, 'refs/tags/release-'))
runs-on: ubuntu-16.04
needs: [linux, macos, windows]
steps:
- name: Clone Repository
uses: actions/checkout@v2
- name: Prepare Environment
run: |
echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV}
make all
- name: Clone Wiki
uses: actions/checkout@v2
with:
repository: openra/openra.wiki
token: ${{ secrets.DOCS_TOKEN }}
path: wiki
- name: Update Wiki (Playtest)
if: startsWith(github.ref, 'refs/tags/playtest-')
run: |
./utility.sh all --settings-docs "${GIT_TAG}" > "wiki/Settings (playtest).md"
- name: Update Wiki (Release)
if: startsWith(github.ref, 'refs/tags/release-')
run: |
./utility.sh all --settings-docs "${GIT_TAG}" > "wiki/Settings.md"
- name: Push Wiki
run: |
cd wiki
git config --local user.email "actions@github.com"
git config --local user.name "GitHub Actions"
git add --all
git commit -m "Update auto-generated documentation for ${GIT_TAG}"
git push origin master
- name: Clone docs.openra.net
uses: actions/checkout@v2
with:
repository: openra/docs.git
token: ${{ secrets.DOCS_TOKEN }}
path: docs
- name: Update docs.openra.net (Playtest)
if: startsWith(github.ref, 'refs/tags/playtest-')
run: |
./utility.sh all --docs "${GIT_TAG}" > "docs/playtest/traits.md"
./utility.sh all --weapon-docs "${GIT_TAG}" > "docs/playtest/weapons.md"
./utility.sh all --lua-docs "${GIT_TAG}" > "docs/playtest/lua.md"
- name: Update docs.openra.net (Release)
if: startsWith(github.ref, 'refs/tags/release-')
run: |
./utility.sh all --docs "${GIT_TAG}" > "docs/release/traits.md"
./utility.sh all --weapon-docs "${GIT_TAG}" > "docs/release/weapons.md"
./utility.sh all --lua-docs "${GIT_TAG}" > "docs/release/lua.md"
- name: Push docs.openra.net
run: |
cd docs
git config --local user.email "actions@github.com"
git config --local user.name "GitHub Actions"
git add --all
git commit -m "Update auto-generated documentation for ${GIT_TAG}"
git push origin master

20
.vscode/launch.json vendored
View File

@@ -11,8 +11,9 @@
"type": "mono"
},
"request": "launch",
"program": "${workspaceRoot}/bin/OpenRA.exe",
"args": ["Game.Mod=cnc", "Engine.EngineDir=.."],
"program": "${workspaceRoot}/OpenRA.Game.exe",
"cwd": "${workspaceRoot}",
"args": ["Game.Mod=cnc"],
"preLaunchTask": "build",
},
{
@@ -25,8 +26,9 @@
"type": "mono"
},
"request": "launch",
"program": "${workspaceRoot}/bin/OpenRA.exe",
"args": ["Game.Mod=ra", "Engine.EngineDir=.."],
"program": "${workspaceRoot}/OpenRA.Game.exe",
"cwd": "${workspaceRoot}",
"args": ["Game.Mod=ra"],
"preLaunchTask": "build",
},
{
@@ -39,8 +41,9 @@
"type": "mono"
},
"request": "launch",
"program": "${workspaceRoot}/bin/OpenRA.exe",
"args": ["Game.Mod=d2k", "Engine.EngineDir=.."],
"program": "${workspaceRoot}/OpenRA.Game.exe",
"cwd": "${workspaceRoot}",
"args": ["Game.Mod=d2k"],
"preLaunchTask": "build",
},
{
@@ -53,8 +56,9 @@
"type": "mono"
},
"request": "launch",
"program": "${workspaceRoot}/bin/OpenRA.exe",
"args": ["Game.Mod=ts", "Engine.EngineDir=.."],
"program": "${workspaceRoot}/OpenRA.Game.exe",
"cwd": "${workspaceRoot}",
"args": ["Game.Mod=ts"],
"preLaunchTask": "build",
},
]

View File

@@ -15,10 +15,6 @@
# to compile and install Red Alert, Tiberian Dawn, and Dune 2000, run:
# make [prefix=/foo] [bindir=/bar/bin] install
#
# to compile and install Red Alert, Tiberian Dawn, and Dune 2000
# using system libraries for native dependencies, run:
# make [prefix=/foo] [bindir=/bar/bin] TARGETPLATFORM=unix-generic install
#
# to install Linux startup scripts, desktop files, icons, and MIME metadata
# make install-linux-shortcuts
#
@@ -52,6 +48,10 @@ bindir ?= $(prefix)/bin
libdir ?= $(prefix)/lib
gameinstalldir ?= $(libdir)/openra
BIN_INSTALL_DIR = $(DESTDIR)$(bindir)
DATA_INSTALL_DIR = $(DESTDIR)$(datadir)
OPENRA_INSTALL_DIR = $(DESTDIR)$(gameinstalldir)
# Toolchain
CWD = $(shell pwd)
MSBUILD = msbuild -verbosity:m -nologo
@@ -61,8 +61,7 @@ RM_R = $(RM) -r
RM_F = $(RM) -f
RM_RF = $(RM) -rf
# Only for use in target version:
VERSION := $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || (c=$$(git rev-parse --short HEAD 2>/dev/null) && echo git-$$c))
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
# Detect target platform for dependencies if not given by the user
ifndef TARGETPLATFORM
@@ -99,10 +98,7 @@ clean:
check:
@echo
@echo "Compiling in debug mode..."
@$(MSBUILD) -t:build -restore -p:Configuration=Debug -p:TargetPlatform=$(TARGETPLATFORM)
ifeq ($(TARGETPLATFORM), unix-generic)
@./configure-system-libraries.sh
endif
@$(MSBUILD) -t:build -restore -p:Configuration=Debug
@echo
@echo "Checking runtime assemblies..."
@$(OPENRA_UTILITY) all --check-runtime-assemblies $(WHITELISTED_OPENRA_ASSEMBLIES) $(WHITELISTED_THIRDPARTY_ASSEMBLIES) $(WHITELISTED_CORE_ASSEMBLIES)
@@ -137,21 +133,18 @@ test: all
############# LOCAL INSTALLATION AND DOWNSTREAM PACKAGING ##############
#
version: VERSION mods/ra/mod.yaml mods/cnc/mod.yaml mods/d2k/mod.yaml mods/ts/mod.yaml mods/modcontent/mod.yaml mods/all/mod.yaml
ifeq ($(VERSION),)
$(error Unable to determine new version (requires git or override of variable VERSION))
endif
@sh -c '. ./packaging/functions.sh; set_engine_version "$(VERSION)" .'
@sh -c '. ./packaging/functions.sh; set_mod_version "$(VERSION)" mods/ra/mod.yaml mods/cnc/mod.yaml mods/d2k/mod.yaml mods/ts/mod.yaml mods/modcontent/mod.yaml mods/all/mod.yaml'
@sh -c '. ./packaging/functions.sh; set_engine_version $(VERSION) .'
@sh -c '. ./packaging/functions.sh; set_mod_version $(VERSION) mods/ra/mod.yaml mods/cnc/mod.yaml mods/d2k/mod.yaml mods/ts/mod.yaml mods/modcontent/mod.yaml mods/all/mod.yaml'
install:
@sh -c '. ./packaging/functions.sh; install_assemblies_mono $(CWD) $(DESTDIR)$(gameinstalldir) $(TARGETPLATFORM) True True True'
@sh -c '. ./packaging/functions.sh; install_data $(CWD) $(DESTDIR)$(gameinstalldir) cnc d2k ra'
@sh -c '. ./packaging/functions.sh; install_assemblies_mono $(CWD) $(OPENRA_INSTALL_DIR) $(TARGETPLATFORM) True True True'
@sh -c '. ./packaging/functions.sh; install_data $(CWD) $(OPENRA_INSTALL_DIR) cnc d2k ra'
install-linux-shortcuts:
@sh -c '. ./packaging/functions.sh; install_linux_shortcuts $(CWD) "$(DESTDIR)" "$(gameinstalldir)" "$(bindir)" "$(datadir)" "$(shell head -n1 VERSION)" cnc d2k ra'
@sh -c '. ./packaging/functions.sh; install_linux_shortcuts $(CWD) $(OPENRA_INSTALL_DIR) $(BIN_INSTALL_DIR) $(DATA_INSTALL_DIR) $(VERSION) cnc d2k ra'
install-linux-appdata:
@sh -c '. ./packaging/functions.sh; install_linux_appdata $(CWD) "$(DESTDIR)" "$(datadir)" cnc d2k ra'
@sh -c '. ./packaging/functions.sh; install_linux_appdata $(CWD) $(DATA_INSTALL_DIR) cnc d2k ra'
help:
@echo 'to compile, run:'
@@ -167,11 +160,7 @@ help:
@echo ' make test'
@echo
@echo 'to compile and install Red Alert, Tiberian Dawn, and Dune 2000 run:'
@echo ' make [prefix=/foo] [TARGETPLATFORM=unix-generic] install'
@echo
@echo 'to compile and install Red Alert, Tiberian Dawn, and Dune 2000'
@echo 'using system libraries for native dependencies, run:'
@echo ' make [prefix=/foo] [bindir=/bar/bin] TARGETPLATFORM=unix-generic install'
@echo ' make [prefix=/foo] install'
@echo
@echo 'to install Linux startup scripts, desktop files, icons, and MIME metadata'
@echo ' make install-linux-shortcuts'

View File

@@ -123,7 +123,6 @@ namespace OpenRA
DisplayFactionId = runtimePlayer.DisplayFaction.InternalName,
Color = runtimePlayer.Color,
Team = client.Team,
Handicap = client.Handicap,
SpawnPoint = runtimePlayer.SpawnPoint,
IsRandomFaction = runtimePlayer.Faction.InternalName != client.Faction,
IsRandomSpawnPoint = runtimePlayer.DisplaySpawnPoint == 0,
@@ -167,7 +166,6 @@ namespace OpenRA
/// <summary>The team ID on start-up, or 0 if the player is not part of a team.</summary>
public int Team;
public int SpawnPoint;
public int Handicap;
/// <summary>True if the faction was chosen at random; otherwise, false.</summary>
public bool IsRandomFaction;

View File

@@ -166,7 +166,6 @@ namespace OpenRA
public void QueryRemoteMapDetails(string repositoryUrl, IEnumerable<string> uids, Action<MapPreview> mapDetailsReceived = null, Action queryFailed = null)
{
var maps = uids.Distinct()
.Where(uid => uid != null)
.Select(uid => previews[uid])
.Where(p => p.Status == MapStatus.Unavailable)
.ToDictionary(p => p.Uid, p => p);

View File

@@ -50,9 +50,6 @@ namespace OpenRA
public bool LockTeam = false;
public int Team = 0;
public bool LockHandicap = false;
public int Handicap = 0;
public string[] Allies = { };
public string[] Enemies = { };

View File

@@ -25,7 +25,6 @@ namespace OpenRA.Network
public readonly string Faction;
public readonly int SpawnPoint;
public readonly int Team;
public readonly int Handicap;
public readonly string Slot;
public readonly string Bot;
public readonly bool IsAdmin;
@@ -40,7 +39,6 @@ namespace OpenRA.Network
Faction = client.Faction;
SpawnPoint = client.SpawnPoint;
Team = client.Team;
Handicap = client.Handicap;
Slot = client.Slot;
Bot = client.Bot;
IsAdmin = client.IsAdmin;
@@ -55,7 +53,6 @@ namespace OpenRA.Network
client.Faction = Faction;
client.SpawnPoint = SpawnPoint;
client.Team = Team;
client.Handicap = Handicap;
client.Slot = Slot;
client.Bot = Bot;
client.IsAdmin = IsAdmin;

View File

@@ -144,7 +144,6 @@ namespace OpenRA.Network
public ClientState State = ClientState.Invalid;
public int Team;
public int Handicap;
public string Slot; // Slot ID, or null for observer
public string Bot; // Bot type, null for real clients
public int BotControllerClientIndex; // who added the bot to the slot
@@ -194,7 +193,6 @@ namespace OpenRA.Network
public bool LockFaction;
public bool LockColor;
public bool LockTeam;
public bool LockHandicap;
public bool LockSpawn;
public bool Required;

View File

@@ -58,7 +58,6 @@ namespace OpenRA
public readonly bool Playable = true;
public readonly int ClientIndex;
public readonly CPos HomeLocation;
public readonly int Handicap;
public readonly PlayerReference PlayerReference;
public readonly bool IsBot;
public readonly string BotType;
@@ -81,7 +80,6 @@ namespace OpenRA
{
get
{
// Players in mission maps must not leave the player view
return !inMissionMap && (spectating || WinState != WinState.Undefined);
}
}
@@ -181,8 +179,6 @@ namespace OpenRA
HomeLocation = assignSpawnPoints?.AssignHomeLocation(world, client, playerRandom) ?? pr.HomeLocation;
SpawnPoint = assignSpawnPoints?.SpawnPointForPlayer(this) ?? client.SpawnPoint;
DisplaySpawnPoint = client.SpawnPoint;
Handicap = client.Handicap;
}
else
{
@@ -198,7 +194,6 @@ namespace OpenRA
DisplayFaction = ResolveDisplayFaction(world, pr.Faction);
HomeLocation = pr.HomeLocation;
SpawnPoint = DisplaySpawnPoint = 0;
Handicap = pr.Handicap;
}
if (!spectating)

View File

@@ -93,8 +93,6 @@ namespace OpenRA.Server
c.SpawnPoint = pr.Spawn;
if (pr.LockTeam)
c.Team = pr.Team;
if (pr.LockHandicap)
c.Team = pr.Handicap;
c.Color = pr.LockColor ? pr.Color : c.PreferredColor;
}
@@ -439,7 +437,6 @@ namespace OpenRA.Server
Faction = "Random",
SpawnPoint = 0,
Team = 0,
Handicap = 0,
State = Session.ClientState.Invalid,
};

View File

@@ -256,8 +256,6 @@ namespace OpenRA
public int IntroductionPromptVersion = 0;
public MPGameFilters MPGameFilters = MPGameFilters.Waiting | MPGameFilters.Empty | MPGameFilters.Protected | MPGameFilters.Started;
public bool PauseShellmap = false;
}
public class Settings

View File

@@ -32,7 +32,6 @@ namespace OpenRA
readonly List<IEffect> effects = new List<IEffect>();
readonly List<IEffect> unpartitionedEffects = new List<IEffect>();
readonly List<ISync> syncedEffects = new List<ISync>();
readonly GameSettings gameSettings;
readonly Queue<Action<World>> frameEndActions = new Queue<Action<World>>();
@@ -227,7 +226,6 @@ namespace OpenRA
};
RulesContainTemporaryBlocker = map.Rules.Actors.Any(a => a.Value.HasTraitInfo<ITemporaryBlockerInfo>());
gameSettings = Game.Settings.Game;
}
public void AddToMaps(Actor self, IOccupySpace ios)
@@ -426,9 +424,7 @@ namespace OpenRA
wasLoadingGameSave = false;
}
// Allow users to pause the shellmap via the settings menu
// Some traits initialize important state during the first tick, so we must allow it to tick at least once
if (!Paused && (Type != WorldType.Shellmap || !gameSettings.PauseShellmap || WorldTick == 0))
if (!Paused)
{
WorldTick++;

View File

@@ -82,9 +82,6 @@ namespace OpenRA.Mods.Cnc.Traits
protected override bool CanAttack(Actor self, in Target target)
{
if (IsTraitPaused)
return false;
if (state == PopupState.Closed)
{
state = PopupState.Transitioning;
@@ -106,9 +103,6 @@ namespace OpenRA.Mods.Cnc.Traits
void INotifyIdle.TickIdle(Actor self)
{
if (IsTraitDisabled || IsTraitPaused)
return;
if (state == PopupState.Open && idleTicks++ > info.CloseDelay)
{
var facingOffset = new WVec(0, -1024, 0).Rotate(WRot.FromYaw(info.DefaultFacing));

View File

@@ -120,7 +120,7 @@ namespace OpenRA.Mods.Cnc.Traits
protected override void Tick(World world)
{
// Cancel the OG if we can't use the power
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
if (!manager.Powers.ContainsKey(order))
world.CancelInputMode();
}

View File

@@ -174,7 +174,7 @@ namespace OpenRA.Mods.Cnc.Traits
protected override void Tick(World world)
{
// Cancel the OG if we can't use the power
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
if (!manager.Powers.ContainsKey(order))
world.CancelInputMode();
}
@@ -274,7 +274,7 @@ namespace OpenRA.Mods.Cnc.Traits
protected override void Tick(World world)
{
// Cancel the OG if we can't use the power
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
if (!manager.Powers.ContainsKey(order))
world.CancelInputMode();
}

View File

@@ -142,13 +142,6 @@ namespace OpenRA.Mods.Common.Activities
// We don't know where the target actually is, so move to where we last saw it
if (useLastVisibleTarget)
{
// HACK: Bot players ignore the standard visibility checks in target.Recalculate,
// which means that targetIsHiddenActor is always false, allowing lastVisibleMaximumRange
// to be assigned zero range by attackAircraft.GetMaximumRangeVersusTarget for e.g. cloaked actors.
// Catch and cancel this edge case to avoid the aircraft stopping mid-air!
if (self.Owner.IsBot && lastVisibleMaximumRange == WDist.Zero)
return true;
// We've reached the assumed position but it is not there - give up
if (checkTarget.IsInRange(pos, lastVisibleMaximumRange))
return true;

View File

@@ -72,7 +72,8 @@ namespace OpenRA.Mods.Common.Effects
return;
var exit = building.NearestExitOrDefault(targetLineNodes[0]);
targetLineNodes.Insert(0, building.CenterPosition + (exit?.Info.SpawnOffset ?? WVec.Zero));
var exitPos = exit != null ? building.World.Map.CenterOfCell(building.Location + exit.Info.ExitCell) : building.CenterPosition;
targetLineNodes.Insert(0, exitPos);
}
IEnumerable<IRenderable> IEffect.Render(WorldRenderer wr) { return SpriteRenderable.None; }

View File

@@ -319,7 +319,7 @@ namespace OpenRA.Mods.Common.FileFormats
// Annoyingly, the complete table is not applied until the frame
// *after* the one that contains the 8th chunk.
// Do we have a set of partial lookup tables ready to apply?
if (currentChunkBuffer == chunkBufferParts && chunkBufferParts != 0)
if (currentChunkBuffer == chunkBufferParts)
{
if (!cbpIsCompressed)
cbf = (byte[])cbp.Clone();

View File

@@ -21,14 +21,12 @@ namespace OpenRA.Mods.Common.Scripting
{
readonly SpawnMapActors sma;
readonly World world;
readonly GameSettings gameSettings;
public MapGlobal(ScriptContext context)
: base(context)
{
sma = context.World.WorldActor.Trait<SpawnMapActors>();
world = context.World;
gameSettings = Game.Settings.Game;
// Register map actors as globals (yuck!)
foreach (var kv in sma.Actors)
@@ -111,9 +109,6 @@ namespace OpenRA.Mods.Common.Scripting
[Desc("Returns true if there is only one human player.")]
public bool IsSinglePlayer { get { return Context.World.LobbyInfo.NonBotPlayers.Count() == 1; } }
[Desc("Returns true if this is a shellmap and the player has paused animations.")]
public bool IsPausedShellmap { get { return Context.World.Type == WorldType.Shellmap && gameSettings.PauseShellmap; } }
[Desc("Returns the value of a `ScriptLobbyDropdown` selected in the game lobby.")]
public LuaValue LobbyOption(string id)
{

View File

@@ -9,8 +9,6 @@
*/
#endregion
using Eluant;
using OpenRA.Primitives;
using OpenRA.Scripting;
using OpenRA.Traits;
@@ -36,18 +34,10 @@ namespace OpenRA.Mods.Common.Scripting
[Desc("Maximum health of the actor.")]
public int MaxHealth { get { return health.MaxHP; } }
[Desc("Kill the actor. damageTypes may be omitted, specified as a string, or as table of strings.")]
public void Kill(object damageTypes = null)
[Desc("Kill the actor.")]
public void Kill()
{
Damage damage;
if (damageTypes is string d)
damage = new Damage(health.MaxHP, new BitSet<DamageType>(new[] { d }));
else if (damageTypes is LuaTable t && t.TryGetClrValue(out string[] ds))
damage = new Damage(health.MaxHP, new BitSet<DamageType>(ds));
else
damage = new Damage(health.MaxHP);
health.InflictDamage(Self, Self, damage, true);
health.InflictDamage(Self, Self, new Damage(health.MaxHP), true);
}
}
}

View File

@@ -52,16 +52,6 @@ namespace OpenRA.Mods.Common.Scripting
}
}
[Desc("The player's handicap level.")]
public int Handicap
{
get
{
var c = Player.World.LobbyInfo.Clients.FirstOrDefault(i => i.Index == Player.ClientIndex);
return c?.Handicap ?? 0;
}
}
[Desc("Returns true if the player is a bot.")]
public bool IsBot { get { return Player.IsBot; } }

View File

@@ -43,7 +43,6 @@ namespace OpenRA.Mods.Common.Server
{ "name", Name },
{ "faction", Faction },
{ "team", Team },
{ "handicap", Handicap },
{ "spawn", Spawn },
{ "clear_spawn", ClearPlayerSpawn },
{ "color", PlayerColor },
@@ -246,7 +245,6 @@ namespace OpenRA.Mods.Common.Server
client.Slot = null;
client.SpawnPoint = 0;
client.Team = 0;
client.Handicap = 0;
client.Color = Color.White;
server.SyncLobbyClients();
CheckAutoStart(server);
@@ -379,7 +377,6 @@ namespace OpenRA.Mods.Common.Server
Faction = "Random",
SpawnPoint = 0,
Team = 0,
Handicap = 0,
State = Session.ClientState.NotReady,
BotControllerClientIndex = controllerClientIndex
};
@@ -739,7 +736,6 @@ namespace OpenRA.Mods.Common.Server
targetClient.Slot = null;
targetClient.SpawnPoint = 0;
targetClient.Team = 0;
targetClient.Handicap = 0;
targetClient.Color = Color.White;
targetClient.State = Session.ClientState.NotReady;
server.SendMessage("{0} moved {1} to spectators.".F(client.Name, targetClient.Name));
@@ -828,42 +824,6 @@ namespace OpenRA.Mods.Common.Server
}
}
static bool Handicap(S server, Connection conn, Session.Client client, string s)
{
lock (server.LobbyInfo)
{
var parts = s.Split(' ');
var targetClient = server.LobbyInfo.ClientWithIndex(Exts.ParseIntegerInvariant(parts[0]));
// Only the host can change other client's info
if (targetClient.Index != client.Index && !client.IsAdmin)
return true;
// Map has disabled handicap changes
if (server.LobbyInfo.Slots[targetClient.Slot].LockHandicap)
return true;
if (!Exts.TryParseIntegerInvariant(parts[1], out var handicap))
{
Log.Write("server", "Invalid handicap: {0}", s);
return false;
}
// Handicaps may be set between 0 - 95% in steps of 5%
var options = Enumerable.Range(0, 20).Select(i => 5 * i);
if (!options.Contains(handicap))
{
Log.Write("server", "Invalid handicap: {0}", s);
return false;
}
targetClient.Handicap = handicap;
server.SyncLobbyClients();
return true;
}
}
static bool ClearPlayerSpawn(S server, Connection conn, Session.Client client, string s)
{
var spawnPoint = Exts.ParseIntegerInvariant(s);
@@ -1043,7 +1003,6 @@ namespace OpenRA.Mods.Common.Server
LockFaction = pr.LockFaction,
LockColor = pr.LockColor,
LockTeam = pr.LockTeam,
LockHandicap = pr.LockHandicap,
LockSpawn = pr.LockSpawn,
Required = pr.Required,
};

View File

@@ -22,6 +22,9 @@ namespace OpenRA.Mods.Common.Server
{
lock (server.LobbyInfo)
{
if (server.LobbyInfo.ClientWithIndex(conn.PlayerIndex).IsAdmin)
return;
var defaults = new Session.Global();
LobbyCommands.LoadMapSettings(server, defaults, server.Map.Rules);

View File

@@ -348,11 +348,8 @@ namespace OpenRA.Mods.Common.Traits
return chosenTarget;
var targetsInRange = self.World.FindActorsInCircle(self.CenterPosition, scanRange)
.Select(Target.FromActor);
if (allowMove || ab.Info.TargetFrozenActors)
targetsInRange = targetsInRange
.Concat(self.Owner.FrozenActorLayer.FrozenActorsInCircle(self.World, self.CenterPosition, scanRange)
.Select(Target.FromActor)
.Concat(self.Owner.FrozenActorLayer.FrozenActorsInCircle(self.World, self.CenterPosition, scanRange)
.Select(Target.FromFrozenActor));
foreach (var target in targetsInRange)

View File

@@ -53,7 +53,8 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits))
{
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
foreach (var u in owner.Units)
owner.Bot.QueueOrder(new Order("AttackMove", u, Target.FromCell(owner.World, owner.TargetActor.Location), false));
// We have gathered sufficient units. Attack the nearest enemy unit.
owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveState(), true);
@@ -123,9 +124,8 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
// Since units have different movement speeds, they get separated while approaching the target.
// Let them regroup into tighter formation.
owner.Bot.QueueOrder(new Order("Stop", leader, false));
var units = owner.Units.Where(a => !ownUnits.Contains(a)).ToArray();
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, leader.Location), false, groupedActors: units));
foreach (var unit in owner.Units.Where(a => !ownUnits.Contains(a)))
owner.Bot.QueueOrder(new Order("AttackMove", unit, Target.FromCell(owner.World, leader.Location), false));
}
else
{
@@ -138,7 +138,8 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackState(), true);
}
else
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
foreach (var a in owner.Units)
owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false));
}
if (ShouldFlee(owner))

View File

@@ -78,7 +78,8 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits))
{
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
foreach (var u in owner.Units)
owner.Bot.QueueOrder(new Order("AttackMove", u, Target.FromCell(owner.World, owner.TargetActor.Location), false));
// We have gathered sufficient units. Attack the nearest enemy unit.
owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackMoveState(), true);
@@ -148,9 +149,8 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
// Since units have different movement speeds, they get separated while approaching the target.
// Let them regroup into tighter formation.
owner.Bot.QueueOrder(new Order("Stop", leader, false));
var units = owner.Units.Where(a => !ownUnits.Contains(a)).ToArray();
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, leader.Location), false, groupedActors: units));
foreach (var unit in owner.Units.Where(a => !ownUnits.Contains(a)))
owner.Bot.QueueOrder(new Order("AttackMove", unit, Target.FromCell(owner.World, leader.Location), false));
}
else
{
@@ -163,7 +163,8 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackState(), true);
}
else
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
foreach (var a in owner.Units)
owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false));
}
if (ShouldFlee(owner))

View File

@@ -55,7 +55,10 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
Backoff--;
}
else
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
{
foreach (var a in owner.Units)
owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false));
}
}
public void Deactivate(Squad owner) { }

View File

@@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits
// This is important because p may have side-effects that trigger a desync if not
// called on the same exits in the same order!
var all = Exits(actor, productionType)
.OrderByDescending(e => e.Info.Priority)
.OrderBy(e => e.Info.Priority)
.ThenBy(e => (actor.World.Map.CenterOfCell(actor.Location + e.Info.ExitCell) - pos).LengthSquared)
.ToList();

View File

@@ -9,8 +9,6 @@
*/
#endregion
using System;
using System.Collections.Generic;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
@@ -30,9 +28,6 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Chance (out of 100) the unit has to enter panic mode when attacking.")]
public readonly int AttackPanicChance = 20;
[Desc("The terrain types that this actor should avoid running on to while panicking.")]
public readonly HashSet<string> AvoidTerrainTypes = new HashSet<string>();
[SequenceReference(prefix: true)]
public readonly string PanicSequencePrefix = "panic-";
@@ -44,7 +39,6 @@ namespace OpenRA.Mods.Common.Traits
readonly ScaredyCatInfo info;
readonly Mobile mobile;
readonly Actor self;
readonly Func<CPos, bool> avoidTerrainFilter;
[Sync]
int panicStartedTick;
@@ -58,9 +52,6 @@ namespace OpenRA.Mods.Common.Traits
this.self = self;
this.info = info;
mobile = self.Trait<Mobile>();
if (info.AvoidTerrainTypes.Count > 0)
avoidTerrainFilter = c => info.AvoidTerrainTypes.Contains(self.World.Map.GetTerrainInfo(c).Type);
}
public void Panic()
@@ -88,10 +79,7 @@ namespace OpenRA.Mods.Common.Traits
if (!Panicking)
return;
// Note: This is just a modified copy of Mobile.Nudge
var cell = mobile.GetAdjacentCell(self.Location, avoidTerrainFilter);
if (cell != null)
self.QueueActivity(false, mobile.MoveTo(cell.Value, 0));
mobile.Nudge(self);
}
void INotifyDamage.Damaged(Actor self, AttackInfo e)

View File

@@ -364,14 +364,14 @@ namespace OpenRA.Mods.Common.Traits
self.QueueActivity(false, MoveTo(cell.Value, 0));
}
public CPos? GetAdjacentCell(CPos nextCell, Func<CPos, bool> preferToAvoid = null)
public CPos? GetAdjacentCell(CPos nextCell)
{
var availCells = new List<CPos>();
var notStupidCells = new List<CPos>();
foreach (CVec direction in CVec.Directions)
{
var p = ToCell + direction;
if (CanEnterCell(p) && CanStayInCell(p) && (preferToAvoid == null || !preferToAvoid(p)))
if (CanEnterCell(p) && CanStayInCell(p))
availCells.Add(p);
else if (p != nextCell && p != ToCell)
notStupidCells.Add(p);

View File

@@ -1,40 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Modifies the damage applied to this actor based on the owner's handicap.")]
public class HandicapDamageMultiplierInfo : TraitInfo
{
public override object Create(ActorInitializer init) { return new HandicapDamageMultiplier(init.Self); }
}
public class HandicapDamageMultiplier : IDamageModifier
{
readonly Actor self;
public HandicapDamageMultiplier(Actor self)
{
this.self = self;
}
int IDamageModifier.GetDamageModifier(Actor attacker, Damage damage)
{
// Equivalent to the health handicap from C&C3:
// 5% handicap = 95% health = 105% damage
// 50% handicap = 50% health = 200% damage
// 95% handicap = 5% health = 2000% damage
return 10000 / (100 - self.Owner.Handicap);
}
}
}

View File

@@ -1,40 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Modifies the damage applied by this actor based on the owner's handicap.")]
public class HandicapFirepowerMultiplierInfo : TraitInfo
{
public override object Create(ActorInitializer init) { return new HandicapFirepowerMultiplier(init.Self); }
}
public class HandicapFirepowerMultiplier : IFirepowerModifier
{
readonly Actor self;
public HandicapFirepowerMultiplier(Actor self)
{
this.self = self;
}
int IFirepowerModifier.GetFirepowerModifier()
{
// Equivalent to the firepower handicap from C&C3:
// 5% handicap = 95% firepower
// 50% handicap = 50% firepower
// 95% handicap = 5% firepower
return 100 - self.Owner.Handicap;
}
}
}

View File

@@ -1,32 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System.Collections.Generic;
using System.Linq;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Modifies the production time of this actor based on the producer's handicap.")]
public class HandicapProductionTimeMultiplierInfo : TraitInfo<HandicapProductionTimeMultiplier>, IProductionTimeModifierInfo
{
int IProductionTimeModifierInfo.GetProductionTimeModifier(TechTree techTree, string queue)
{
// Equivalent to the build speed handicap from C&C3:
// 5% handicap = 105% build time
// 50% handicap = 150% build time
// 95% handicap = 195% build time
return 100 + techTree.Owner.Handicap;
}
}
public class HandicapProductionTimeMultiplier { }
}

View File

@@ -12,7 +12,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
@@ -59,19 +58,15 @@ namespace OpenRA.Mods.Common.Traits
[NotificationReference("Speech")]
public readonly string LeaveNotification = null;
public override object Create(ActorInitializer init) { return new MissionObjectives(init.Self.Owner, this); }
public override object Create(ActorInitializer init) { return new MissionObjectives(init.World, this); }
}
public class MissionObjectives : INotifyWinStateChanged, ISync, IResolveOrder, IWorldLoaded
public class MissionObjectives : INotifyWinStateChanged, ISync, IResolveOrder
{
public readonly MissionObjectivesInfo Info;
readonly List<MissionObjective> objectives = new List<MissionObjective>();
readonly Player player;
public ReadOnlyList<MissionObjective> Objectives;
Player[] enemies;
Player[] allies;
[Sync]
public int ObjectivesHash
{
@@ -88,21 +83,12 @@ namespace OpenRA.Mods.Common.Traits
// The player's WinState is only updated when his allies have all completed their objective as well.
public WinState WinStateCooperative { get; private set; }
public MissionObjectives(Player player, MissionObjectivesInfo info)
public MissionObjectives(World world, MissionObjectivesInfo info)
{
Info = info;
this.player = player;
Objectives = new ReadOnlyList<MissionObjective>(objectives);
}
void IWorldLoaded.WorldLoaded(World w, WorldRenderer wr)
{
// Players and NonCombatants are fixed once the game starts, but the result of IsAlliedWith
// may change once players are marked as spectators, so cache these
allies = player.World.Players.Where(p => !p.NonCombatant && player.IsAlliedWith(p)).ToArray();
enemies = player.World.Players.Where(p => !p.NonCombatant && player.RelationshipWith(p) == PlayerRelationship.Enemy).ToArray();
}
public int Add(Player player, string description, string type, bool required = true, bool inhibitAnnouncement = false)
{
var newID = objectives.Count;
@@ -154,9 +140,10 @@ namespace OpenRA.Mods.Common.Traits
void CheckIfGameIsOver(Player player)
{
var gameOver = player.World.Players.All(p => p.NonCombatant || p.WinState != WinState.Undefined || !p.HasObjectives);
var players = player.World.Players.Where(p => !p.NonCombatant);
var gameOver = players.All(p => p.WinState != WinState.Undefined || !p.HasObjectives);
if (gameOver)
{
Game.RunAfterDelay(Info.GameOverDelay, () =>
{
if (!Game.IsCurrentWorld(player.World))
@@ -166,14 +153,17 @@ namespace OpenRA.Mods.Common.Traits
player.World.SetPauseState(true);
player.World.PauseStateLocked = true;
});
}
}
void INotifyWinStateChanged.OnPlayerWon(Player player)
{
var players = player.World.Players.Where(p => !p.NonCombatant);
var enemies = players.Where(p => !p.IsAlliedWith(player));
if (Info.Cooperative)
{
WinStateCooperative = WinState.Won;
var allies = players.Where(p => p.IsAlliedWith(player));
if (allies.All(p => p.PlayerActor.Trait<MissionObjectives>().WinStateCooperative == WinState.Won))
{
@@ -203,9 +193,13 @@ namespace OpenRA.Mods.Common.Traits
void INotifyWinStateChanged.OnPlayerLost(Player player)
{
var players = player.World.Players.Where(p => !p.NonCombatant);
var enemies = players.Where(p => !p.IsAlliedWith(player));
if (Info.Cooperative)
{
WinStateCooperative = WinState.Lost;
var allies = players.Where(p => p.IsAlliedWith(player));
if (allies.Any(p => p.PlayerActor.Trait<MissionObjectives>().WinStateCooperative == WinState.Lost))
{

View File

@@ -412,11 +412,8 @@ namespace OpenRA.Mods.Common.Traits
var hasPlayedSound = false;
BeginProduction(new ProductionItem(this, order.TargetString, cost, playerPower, () => self.World.AddFrameEndTask(_ =>
{
// Make sure the item hasn't been invalidated between the ProductionItem ticking and this FrameEndTask running
if (!Queue.Any(i => i.Done && i.Item == unit.Name))
return;
var isBuilding = unit.HasTraitInfo<BuildingInfo>();
if (isBuilding && !hasPlayedSound)
hasPlayedSound = Game.Sound.PlayNotification(rules, self.Owner, "Speech", Info.ReadyAudio, self.Owner.Faction.InternalName);
else if (!isBuilding)

View File

@@ -106,8 +106,6 @@ namespace OpenRA.Mods.Common.Traits
return ret;
}
public Player Owner { get { return player; } }
class Watcher
{
public readonly string Key;

View File

@@ -29,10 +29,8 @@ namespace OpenRA.Mods.Common.Traits.Render
public readonly string DefaultAttackSequence = null;
[SequenceReference(dictionaryReference: LintDictionaryReference.Values)]
[Desc("Attack sequence to use for each armament.",
"A dictionary of [armament name]: [sequence name(s)].",
"Multiple sequence names can be defined to specify per-burst animations.")]
public readonly Dictionary<string, string[]> AttackSequences = new Dictionary<string, string[]>();
[Desc("Attack sequence to use for each armament.")]
public readonly Dictionary<string, string> AttackSequences = new Dictionary<string, string>();
[SequenceReference]
public readonly string[] IdleSequences = { };
@@ -135,21 +133,11 @@ namespace OpenRA.Mods.Common.Traits.Render
}
}
void Attacking(Actor self, Armament a, Barrel barrel)
public void Attacking(Actor self, in Target target, Armament a)
{
var info = GetDisplayInfo();
var sequence = info.DefaultAttackSequence;
if (info.AttackSequences.TryGetValue(a.Info.Name, out var sequences) && sequences.Length > 0)
{
sequence = sequences[0];
// Find the sequence corresponding to this barrel/burst.
if (barrel != null && sequences.Length > 1)
for (var i = 0; i < sequences.Length; i++)
if (a.Barrels[i] == barrel)
sequence = sequences[i];
}
if (!info.AttackSequences.TryGetValue(a.Info.Name, out var sequence))
sequence = info.DefaultAttackSequence;
if (!string.IsNullOrEmpty(sequence) && DefaultAnimation.HasSequence(NormalizeInfantrySequence(self, sequence)))
{
@@ -160,9 +148,7 @@ namespace OpenRA.Mods.Common.Traits.Render
void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel)
{
// HACK: The FrameEndTask makes sure that this runs after Tick(), preventing that from
// overriding the animation when an infantry unit stops to attack
self.World.AddFrameEndTask(_ => Attacking(self, a, barrel));
Attacking(self, target, a);
}
void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) { }
@@ -174,6 +160,10 @@ namespace OpenRA.Mods.Common.Traits.Render
protected virtual void Tick(Actor self)
{
// Attacking takes care of reverting back to PlayStandAnimation
if (state == AnimationState.Attacking)
return;
if (rsm != null)
{
if (wasModifying != rsm.IsModifyingSequence)

View File

@@ -137,7 +137,7 @@ namespace OpenRA.Mods.Common.Traits
protected override void Tick(World world)
{
// Cancel the OG if we can't use the power
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
if (!manager.Powers.ContainsKey(order))
world.CancelInputMode();
}

View File

@@ -106,7 +106,7 @@ namespace OpenRA.Mods.Common.Traits
void IOrderGenerator.Tick(World world)
{
// Cancel the OG if we can't use the power
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
if (!manager.Powers.ContainsKey(order))
world.CancelInputMode();
}

View File

@@ -309,7 +309,7 @@ namespace OpenRA.Mods.Common.Traits
protected override void Tick(World world)
{
// Cancel the OG if we can't use the power
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
if (!manager.Powers.ContainsKey(order))
world.CancelInputMode();
}

View File

@@ -9,8 +9,6 @@
*/
#endregion
using System.Collections.Generic;
using System.Linq;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
@@ -29,9 +27,6 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Maximum amount of ticks the actor will sit idly before starting to wander.")]
public readonly int MaxMoveDelay = 0;
[Desc("The terrain types that this actor should avoid wandering on to.")]
public readonly HashSet<string> AvoidTerrainTypes = new HashSet<string>();
public override object Create(ActorInitializer init) { return new Wanders(init.Self, this); }
}
@@ -80,8 +75,8 @@ namespace OpenRA.Mods.Common.Traits
return;
var targetCell = PickTargetLocation();
if (targetCell.HasValue)
DoAction(self, targetCell.Value);
if (targetCell != CPos.Zero)
DoAction(self, targetCell);
}
void INotifyIdle.TickIdle(Actor self)
@@ -89,7 +84,7 @@ namespace OpenRA.Mods.Common.Traits
TickIdle(self);
}
CPos? PickTargetLocation()
CPos PickTargetLocation()
{
var target = self.CenterPosition + new WVec(0, -1024 * effectiveMoveRadius, 0).Rotate(WRot.FromFacing(self.World.SharedRandom.Next(255)));
var targetCell = self.World.Map.CellContaining(target);
@@ -100,15 +95,7 @@ namespace OpenRA.Mods.Common.Traits
if (++ticksIdle % info.ReduceMoveRadiusDelay == 0)
effectiveMoveRadius--;
// We'll be back the next tick; better to sit idle for a few seconds than prolong this tick indefinitely with a loop
return null;
}
if (info.AvoidTerrainTypes.Count > 0)
{
var terrainType = self.World.Map.GetTerrainInfo(targetCell).Type;
if (Info.AvoidTerrainTypes.Contains(terrainType))
return null;
return CPos.Zero; // We'll be back the next tick; better to sit idle for a few seconds than prolong this tick indefinitely with a loop
}
ticksIdle = 0;

View File

@@ -64,7 +64,6 @@ namespace OpenRA.Mods.Common.Traits
DisplayFactionId = clientFaction.InternalName,
Color = client.Color,
Team = client.Team,
Handicap = client.Handicap,
SpawnPoint = resolvedSpawnPoint,
IsRandomFaction = clientFaction.RandomFactionMembers.Any(),
IsRandomSpawnPoint = client.SpawnPoint == 0,

View File

@@ -214,10 +214,6 @@ namespace OpenRA.Mods.Common.Traits
if (factionInit != null && factionInit.Value == Owner.Faction)
return false;
var healthInit = init as HealthInit;
if (healthInit != null && healthInit.Value == 100)
return false;
// TODO: Other default values will need to be filtered
// here after we have built a properties panel
return true;

View File

@@ -218,9 +218,6 @@ namespace OpenRA.Mods.Common
if (t.IsGenericType && t.GetGenericTypeDefinition().GetInterfaces().Any(e => e.IsGenericType && e.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
return "Collection of {0}".F(FriendlyTypeName(t.GetGenericArguments().First()));
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
return "{0} (optional)".F(t.GetGenericArguments().Select(FriendlyTypeName).First());
if (t == typeof(int) || t == typeof(uint))
return "Integer";

View File

@@ -268,8 +268,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
case "delete":
{
// Yaml path may be specified relative to a named directory (e.g. ^SupportDir) or the detected disc path
var sourcePath = i.Value.Value.StartsWith("^") ? Platform.ResolvePath(i.Value.Value) : Path.Combine(path, i.Value.Value);
var sourcePath = Path.Combine(path, i.Value.Value);
// Try as an absolute path
if (!File.Exists(sourcePath))
sourcePath = Platform.ResolvePath(i.Value.Value);
Log.Write("debug", "Deleting {0}", sourcePath);
File.Delete(sourcePath);
@@ -322,8 +325,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
static void ExtractFromPackage(ExtractionType type, string path, MiniYaml actionYaml, List<string> extractedFiles, Action<string> updateMessage)
{
// Yaml path may be specified relative to a named directory (e.g. ^SupportDir) or the detected disc path
var sourcePath = actionYaml.Value.StartsWith("^") ? Platform.ResolvePath(actionYaml.Value) : Path.Combine(path, actionYaml.Value);
var sourcePath = Path.Combine(path, actionYaml.Value);
// Try as an absolute path
if (!File.Exists(sourcePath))
sourcePath = Platform.ResolvePath(actionYaml.Value);
using (var source = File.OpenRead(sourcePath))
{
@@ -378,8 +384,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
static void ExtractFromMSCab(string path, MiniYaml actionYaml, List<string> extractedFiles, Action<string> updateMessage)
{
// Yaml path may be specified relative to a named directory (e.g. ^SupportDir) or the detected disc path
var sourcePath = actionYaml.Value.StartsWith("^") ? Platform.ResolvePath(actionYaml.Value) : Path.Combine(path, actionYaml.Value);
var sourcePath = Path.Combine(path, actionYaml.Value);
// Try as an absolute path
if (!File.Exists(sourcePath))
sourcePath = Platform.ResolvePath(actionYaml.Value);
using (var source = File.OpenRead(sourcePath))
{
@@ -409,8 +418,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
static void ExtractFromISCab(string path, MiniYaml actionYaml, List<string> extractedFiles, Action<string> updateMessage)
{
// Yaml path may be specified relative to a named directory (e.g. ^SupportDir) or the detected disc path
var sourcePath = actionYaml.Value.StartsWith("^") ? Platform.ResolvePath(actionYaml.Value) : Path.Combine(path, actionYaml.Value);
var sourcePath = Path.Combine(path, actionYaml.Value);
// Try as an absolute path
if (!File.Exists(sourcePath))
sourcePath = Platform.ResolvePath(actionYaml.Value);
var volumeNode = actionYaml.Nodes.FirstOrDefault(n => n.Key == "Volumes");
if (volumeNode == null)

View File

@@ -624,7 +624,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
LobbyUtils.SetupEditableColorWidget(template, slot, client, orderManager, shellmapWorld, colorPreview);
LobbyUtils.SetupEditableFactionWidget(template, slot, client, orderManager, factions);
LobbyUtils.SetupEditableTeamWidget(template, slot, client, orderManager, map);
LobbyUtils.SetupEditableHandicapWidget(template, slot, client, orderManager, map);
LobbyUtils.SetupEditableSpawnWidget(template, slot, client, orderManager, map);
LobbyUtils.SetupEditableReadyWidget(template, slot, client, orderManager, map);
}
@@ -641,7 +640,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (isHost)
{
LobbyUtils.SetupEditableTeamWidget(template, slot, client, orderManager, map);
LobbyUtils.SetupEditableHandicapWidget(template, slot, client, orderManager, map);
LobbyUtils.SetupEditableSpawnWidget(template, slot, client, orderManager, map);
LobbyUtils.SetupPlayerActionWidget(template, slot, client, orderManager, worldRenderer,
lobby, () => panel = PanelType.Kick, () => panel = PanelType.Players);
@@ -650,7 +648,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{
LobbyUtils.SetupNameWidget(template, slot, client, orderManager, worldRenderer);
LobbyUtils.SetupTeamWidget(template, slot, client);
LobbyUtils.SetupHandicapWidget(template, slot, client);
LobbyUtils.SetupSpawnWidget(template, slot, client);
}
@@ -755,6 +752,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
void UpdateDiscordStatus()
{
var mapTitle = map.Title;
var numberOfPlayers = 0;
var slots = 0;
@@ -773,11 +771,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
}
}
// Add extra slots to keep the join button active for spectators
if (numberOfPlayers == slots && orderManager.LobbyInfo.GlobalSettings.AllowSpectators)
slots = numberOfPlayers + 1;
var details = map.Title + " - " + orderManager.LobbyInfo.GlobalSettings.ServerName;
if (updateDiscordStatus)
{
string secret = null;
@@ -788,8 +781,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
}
var state = skirmishMode ? DiscordState.InSkirmishLobby : DiscordState.InMultiplayerLobby;
DiscordService.UpdateStatus(state, mapTitle, secret, numberOfPlayers, slots);
DiscordService.UpdateStatus(state, details, secret, numberOfPlayers, slots);
updateDiscordStatus = false;
}
else
@@ -797,7 +790,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (!skirmishMode)
DiscordService.UpdatePlayers(numberOfPlayers, slots);
DiscordService.UpdateDetails(details);
DiscordService.UpdateDetails(mapTitle);
}
}
@@ -813,8 +806,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Ui.CloseWindow();
var state = skirmishMode ? DiscordState.PlayingSkirmish : DiscordState.PlayingMultiplayer;
var details = map.Title + " - " + orderManager.LobbyInfo.GlobalSettings.ServerName;
DiscordService.UpdateStatus(state, details);
DiscordService.UpdateStatus(state);
onStart();
}

View File

@@ -146,25 +146,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("TEAM_DROPDOWN_TEMPLATE", 150, options, setupItem);
}
public static void ShowHandicapDropDown(DropDownButtonWidget dropdown, Session.Client client,
OrderManager orderManager)
{
Func<int, ScrollItemWidget, ScrollItemWidget> setupItem = (ii, itemTemplate) =>
{
var item = ScrollItemWidget.Setup(itemTemplate,
() => client.Handicap == ii,
() => orderManager.IssueOrder(Order.Command("handicap {0} {1}".F(client.Index, ii))));
var label = "{0}%".F(ii);
item.Get<LabelWidget>("LABEL").GetText = () => label;
return item;
};
// Handicaps may be set between 0 - 95% in steps of 5%
var options = Enumerable.Range(0, 20).Select(i => 5 * i);
dropdown.ShowDropDown("TEAM_DROPDOWN_TEMPLATE", 150, options, setupItem);
}
public static void ShowSpawnDropDown(DropDownButtonWidget dropdown, Session.Client client,
OrderManager orderManager, IEnumerable<int> spawnPoints)
{
@@ -581,29 +562,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
HideChildWidget(parent, "TEAM_DROPDOWN");
}
public static void SetupEditableHandicapWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map)
{
var dropdown = parent.Get<DropDownButtonWidget>("HANDICAP_DROPDOWN");
dropdown.IsVisible = () => true;
dropdown.IsDisabled = () => s.LockTeam || orderManager.LocalClient.IsReady;
dropdown.OnMouseDown = _ => ShowHandicapDropDown(dropdown, c, orderManager);
var handicapLabel = new CachedTransform<int, string>(h => "{0}%".F(h));
dropdown.GetText = () => handicapLabel.Update(c.Handicap);
HideChildWidget(parent, "HANDICAP");
}
public static void SetupHandicapWidget(Widget parent, Session.Slot s, Session.Client c)
{
var team = parent.Get<LabelWidget>("HANDICAP");
team.IsVisible = () => true;
var handicapLabel = new CachedTransform<int, string>(h => "{0}%".F(h));
team.GetText = () => handicapLabel.Update(c.Handicap);
HideChildWidget(parent, "HANDICAP_DROPDOWN");
}
public static void SetupEditableSpawnWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, MapPreview map)
{
var dropdown = parent.Get<DropDownButtonWidget>("SPAWN_DROPDOWN");

View File

@@ -43,12 +43,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
this.modData = modData;
this.onSelect = onSelect;
var approving = new Action(() =>
{
Ui.CloseWindow();
onSelect?.Invoke(selectedUid);
});
var approving = new Action(() => { Ui.CloseWindow(); onSelect(selectedUid); });
var canceling = new Action(() => { Ui.CloseWindow(); onExit(); });
var okButton = widget.Get<ButtonWidget>("BUTTON_OK");

View File

@@ -334,24 +334,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic
List<GameServer> games = null;
if (i.Error == null)
{
games = new List<GameServer>();
try
{
var data = Encoding.UTF8.GetString(i.Result);
var yaml = MiniYaml.FromString(data);
foreach (var node in yaml)
{
try
{
var gs = new GameServer(node.Value);
if (gs.Address != null)
games.Add(gs);
}
catch
{
// Ignore any invalid games advertised.
}
}
games = yaml.Select(a => new GameServer(a.Value))
.Where(gs => gs.Address != null)
.ToList();
}
catch
{

View File

@@ -246,8 +246,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate");
BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", ds, "MaxFramerate");
BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors");
if (panel.GetOrNull<CheckboxWidget>("PAUSE_SHELLMAP_CHECKBOX") != null)
BindCheckboxPref(panel, "PAUSE_SHELLMAP_CHECKBOX", gs, "PauseShellmap");
var languageDropDownButton = panel.GetOrNull<DropDownButtonWidget>("LANGUAGE_DROPDOWNBUTTON");
if (languageDropDownButton != null)

View File

@@ -86,8 +86,7 @@ namespace OpenRA.Mods.D2k.Traits.Buildings
// Fill the footprint with random variants
foreach (var c in info.Tiles(self.Location))
{
// Only place on allowed terrain types
if (!map.Contains(c) || map.CustomTerrain[c] != byte.MaxValue || !info.TerrainTypes.Contains(map.GetTerrainInfo(c).Type))
if (!map.Contains(c) || map.CustomTerrain[c] != byte.MaxValue)
continue;
// Don't place under other buildings (or their bib)
@@ -103,9 +102,7 @@ namespace OpenRA.Mods.D2k.Traits.Buildings
for (var i = 0; i < template.TilesCount; i++)
{
var c = self.Location + new CVec(i % template.Size.X, i / template.Size.X);
// Only place on allowed terrain types
if (!map.Contains(c) || map.CustomTerrain[c] != byte.MaxValue || !info.TerrainTypes.Contains(map.GetTerrainInfo(c).Type))
if (!map.Contains(c) || map.CustomTerrain[c] != byte.MaxValue)
continue;
// Don't place under other buildings (or their bib)

View File

@@ -47,7 +47,7 @@
</AssemblyAttribute>
</ItemGroup>
<ItemGroup>
<PackageReference Include="OpenRA-SDL2-CS" Version="1.0.28" />
<PackageReference Include="OpenRA-SDL2-CS" Version="1.0.27" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj" />

View File

@@ -24,8 +24,7 @@ function All-Command
{
echo "Downloading IP2Location GeoIP database."
$target = Join-Path $pwd.ToString() "IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP"
[Net.ServicePointManager]::SecurityProtocol = 'Tls12'
(New-Object System.Net.WebClient).DownloadFile("https://github.com/OpenRA/GeoIP-Database/releases/download/monthly/IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP", $target)
(New-Object System.Net.WebClient).DownloadFile("https://download.ip2location.com/lite/IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP", $target)
}
}
@@ -37,8 +36,9 @@ function Clean-Command
}
dotnet clean /nologo
Remove-Item ./bin -Recurse -ErrorAction Ignore
Remove-Item ./*/obj -Recurse -ErrorAction Ignore
rm ./bin -r
rm ./*/bin -r
rm ./*/obj -r
Write-Host "Clean complete." -ForegroundColor Green
}
@@ -99,13 +99,13 @@ function Test-Command
Write-Host "Testing mods..." -ForegroundColor Cyan
Write-Host "Testing Tiberian Sun mod MiniYAML..." -ForegroundColor Cyan
InvokeCommand "$utilityPath ts --check-yaml"
Invoke-Expression "$utilityPath ts --check-yaml"
Write-Host "Testing Dune 2000 mod MiniYAML..." -ForegroundColor Cyan
InvokeCommand "$utilityPath d2k --check-yaml"
Invoke-Expression "$utilityPath d2k --check-yaml"
Write-Host "Testing Tiberian Dawn mod MiniYAML..." -ForegroundColor Cyan
InvokeCommand "$utilityPath cnc --check-yaml"
Invoke-Expression "$utilityPath cnc --check-yaml"
Write-Host "Testing Red Alert mod MiniYAML..." -ForegroundColor Cyan
InvokeCommand "$utilityPath ra --check-yaml"
Invoke-Expression "$utilityPath ra --check-yaml"
}
function Check-Command
@@ -120,10 +120,10 @@ function Check-Command
if ((CheckForUtility) -eq 0)
{
Write-Host "Checking for explicit interface violations..." -ForegroundColor Cyan
InvokeCommand "$utilityPath all --check-explicit-interfaces"
Invoke-Expression "$utilityPath all --check-explicit-interfaces"
Write-Host "Checking for incorrect conditional trait interface overrides..." -ForegroundColor Cyan
InvokeCommand "$utilityPath all --check-conditional-trait-interface-overrides"
Invoke-Expression "$utilityPath all --check-conditional-trait-interface-overrides"
}
}
@@ -152,6 +152,20 @@ function Check-Scripts-Command
}
}
function Docs-Command
{
if ((CheckForUtility) -eq 1)
{
return
}
./make.ps1 version
Invoke-Expression "$utilityPath all --docs" | Out-File -Encoding "UTF8" DOCUMENTATION.md
Invoke-Expression "$utilityPath all --weapon-docs" | Out-File -Encoding "UTF8" WEAPONS.md
Invoke-Expression "$utilityPath all --lua-docs" | Out-File -Encoding "UTF8" Lua-API.md
Invoke-Expression "$utilityPath all --settings-docs" | Out-File -Encoding "UTF8" Settings.md
}
function CheckForUtility
{
if (Test-Path $utilityPath)
@@ -187,20 +201,6 @@ function WaitForInput
}
}
function InvokeCommand
{
param($expression)
# $? is the return value of the called expression
# Invoke-Expression itself will always succeed, even if the invoked expression fails
# So temporarily store the return value in $success
$expression += '; $success = $?'
Invoke-Expression $expression
if ($success -eq $False)
{
exit 1
}
}
###############################################################
############################ Main #############################
###############################################################
@@ -223,6 +223,7 @@ if ($args.Length -eq 0)
Write-Host " test, t Tests the default mods for errors."
Write-Host " check, ck Checks .cs files for StyleCop violations."
Write-Host " check-scripts, cs Checks .lua files for syntax errors."
Write-Host " docs Generates the trait and Lua API documentation."
Write-Host ""
$command = (Read-Host "Enter command").Split(' ', 2)
}
@@ -248,6 +249,7 @@ switch ($execute)
{"test", "t" -contains $_} { Test-Command }
{"check", "ck" -contains $_} { Check-Command }
{"check-scripts", "cs" -contains $_} { Check-Scripts-Command }
"docs" { Docs-Command }
Default { Write-Host ("Invalid command '{0}'" -f $command) }
}

View File

@@ -20,13 +20,12 @@ Container@LOBBY_MUSIC_BIN:
Height: 25
Text: Track
Font: Bold
Label@LENGTH:
X: PARENT_RIGHT - 80
Label@TYPE:
X: PARENT_RIGHT - 63
Height: 25
Width: 50
Text: Length
Font: Bold
Align: Right
Background@CONTROLS:
Background: panel-transparent
Width: 308

View File

@@ -23,21 +23,21 @@ Container@LOBBY_OPTIONS_BIN:
Height: 34
Children:
Checkbox@A:
Width: 220
Width: 175
Height: 20
Font: Regular
Visible: False
TooltipContainer: TOOLTIP_CONTAINER
Checkbox@B:
X: 225
Width: 220
X: 195
Width: 175
Height: 20
Font: Regular
Visible: False
TooltipContainer: TOOLTIP_CONTAINER
Checkbox@C:
X: 450
Width: 190
X: 375
Width: 175
Height: 20
Font: Regular
Visible: False
@@ -47,26 +47,26 @@ Container@LOBBY_OPTIONS_BIN:
Width: PARENT_RIGHT
Children:
Label@A_DESC:
Width: 140
Width: 80
Height: 25
Align: Right
Visible: False
DropDownButton@A:
X: 145
Width: 180
X: 85
Width: 160
Height: 25
Font: Regular
Visible: False
TooltipContainer: TOOLTIP_CONTAINER
Label@B_DESC:
X: PARENT_RIGHT - WIDTH - 203
Width: 140
X: PARENT_RIGHT - WIDTH - 183
Width: 160
Height: 25
Align: Right
Visible: False
DropDownButton@B:
X: PARENT_RIGHT - WIDTH - 18
Width: 180
Width: 160
Height: 25
Font: Regular
Visible: False

View File

@@ -16,41 +16,34 @@ Container@LOBBY_PLAYER_BIN:
Font: Bold
Label@COLOR:
X: 210
Width: 94
Width: 76
Height: 25
Text: Color
Align: Center
Font: Bold
Label@FACTION:
X: 309
X: 291
Width: 120
Height: 25
Text: Faction
Align: Center
Font: Bold
Label@TEAM:
X: 460-25
X: 416
Width: 50
Height: 25
Text: Team
Align: Center
Font: Bold
Label@HANDICAP:
X: 491
Width: 75
Height: 25
Text: Handicap
Align: Center
Font: Bold
Label@SPAWN:
X: 571
X: 471
Width: 50
Height: 25
Text: Spawn
Align: Left
Font: Bold
Label@STATUS:
X: 627
X: 527
Width: 20
Height: 25
Text: Ready
@@ -115,7 +108,7 @@ Container@LOBBY_PLAYER_BIN:
Visible: false
DropDownButton@COLOR:
X: 210
Width: 94
Width: 76
Height: 25
Font: Regular
IgnoreChildMouseOver: true
@@ -126,7 +119,7 @@ Container@LOBBY_PLAYER_BIN:
Width: PARENT_RIGHT - 35
Height: PARENT_BOTTOM - 12
DropDownButton@FACTION:
X: 309
X: 291
Width: 120
Height: 25
Font: Regular
@@ -145,24 +138,17 @@ Container@LOBBY_PLAYER_BIN:
Height: 25
Text: Faction
DropDownButton@TEAM_DROPDOWN:
X: 435
X: 416
Width: 50
Height: 25
Font: Regular
DropDownButton@HANDICAP_DROPDOWN:
X: 491
Width: 75
Height: 25
Font: Regular
TooltipContainer: TOOLTIP_CONTAINER
TooltipText: A handicap decreases the combat effectiveness of the player's forces
DropDownButton@SPAWN_DROPDOWN:
X: 571
X: 471
Width: 50
Height: 25
Font: Regular
Image@STATUS_IMAGE:
X: 629
X: 529
Y: 4
Width: 20
Height: 20
@@ -170,7 +156,7 @@ Container@LOBBY_PLAYER_BIN:
ImageName: checked
Visible: false
Checkbox@STATUS_CHECKBOX:
X: 627
X: 527
Y: 2
Width: 20
Height: 20
@@ -238,10 +224,10 @@ Container@LOBBY_PLAYER_BIN:
ColorBlock@COLORBLOCK:
X: 215
Y: 6
Width: 59
Width: 41
Height: 13
Container@FACTION:
X: 309
X: 291
Width: 120
Height: 25
Children:
@@ -256,41 +242,29 @@ Container@LOBBY_PLAYER_BIN:
Height: 25
Text: Faction
Label@TEAM:
X: 435
X: 416
Width: 25
Height: 25
Align: Center
Label@SPAWN:
X: 471
Width: 25
Height: 25
Align: Center
DropDownButton@TEAM_DROPDOWN:
X: 435
X: 416
Width: 50
Height: 25
Font: Regular
Visible: false
Label@HANDICAP:
X: 491
Width: 50
Height: 25
Align: Center
DropDownButton@HANDICAP_DROPDOWN:
X: 491
Width: 75
Height: 25
Font: Regular
TooltipContainer: TOOLTIP_CONTAINER
TooltipText: A handicap decreases the combat effectiveness of the player's forces
Label@SPAWN:
X: 571
Width: 25
Height: 25
Align: Center
DropDownButton@SPAWN_DROPDOWN:
X: 571
X: 471
Width: 50
Height: 25
Font: Regular
Visible: false
Image@STATUS_IMAGE:
X: 629
X: 529
Y: 4
Width: 20
Height: 20
@@ -317,7 +291,7 @@ Container@LOBBY_PLAYER_BIN:
Visible: false
Button@JOIN:
X: 210
Width: 438
Width: 338
Height: 25
Text: Play in this slot
Font: Regular
@@ -366,13 +340,13 @@ Container@LOBBY_PLAYER_BIN:
Template: ANONYMOUS_PLAYER_TOOLTIP
Label@SPECTATOR:
X: 210
Width: 441
Width: 341
Height: 25
Text: Spectator
Align: Center
Font: Bold
Image@STATUS_IMAGE:
X: 629
X: 529
Y: 4
Width: 20
Height: 20
@@ -380,7 +354,7 @@ Container@LOBBY_PLAYER_BIN:
ImageName: checked
Visible: false
Checkbox@STATUS_CHECKBOX:
X: 627
X: 527
Y: 2
Width: 20
Height: 20
@@ -447,13 +421,13 @@ Container@LOBBY_PLAYER_BIN:
Template: ANONYMOUS_PLAYER_TOOLTIP
Label@SPECTATOR:
X: 210
Width: 441
Width: 341
Height: 25
Text: Spectator
Align: Center
Font: Bold
Image@STATUS_IMAGE:
X: 627
X: 527
Y: 4
Width: 20
Height: 20
@@ -474,7 +448,7 @@ Container@LOBBY_PLAYER_BIN:
Text: Allow Spectators?
Button@SPECTATE:
X: 210
Width: 438
Width: 338
Height: 25
Text: Spectate
Font: Regular

View File

@@ -9,32 +9,32 @@ Container@LOBBY_SERVERS_BIN:
Children:
Label@NAME:
X: 5
Width: 355
Width: 255
Height: 25
Text: Server
Align: Center
Font: Bold
Label@PLAYERS:
X: 390
X: 290
Width: 85
Height: 25
Text: Players
Font: Bold
Label@LOCATION:
X: 480
X: 380
Width: 110
Height: 25
Text: Location
Font: Bold
Label@STATUS:
X: 595
X: 495
Width: 50
Height: 25
Text: Status
Font: Bold
LogicTicker@NOTICE_WATCHER:
Container@NOTICE_CONTAINER:
Width: PARENT_RIGHT
Width: 582
Height: 19
Children:
Background@bg:
@@ -87,12 +87,12 @@ Container@LOBBY_SERVERS_BIN:
Children:
LabelWithTooltip@TITLE:
X: 5
Width: 345
Width: 245
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Image@PASSWORD_PROTECTED:
X: 372
X: 272
Y: 6
Width: 12
Height: 13
@@ -101,7 +101,7 @@ Container@LOBBY_SERVERS_BIN:
TooltipTemplate: SIMPLE_TOOLTIP
TooltipText: Requires Password
Image@REQUIRES_AUTHENTICATION:
X: 372
X: 272
Y: 6
Width: 12
Height: 13
@@ -110,17 +110,17 @@ Container@LOBBY_SERVERS_BIN:
TooltipTemplate: SIMPLE_TOOLTIP
TooltipText: Requires OpenRA forum account
LabelWithTooltip@PLAYERS:
X: 390
X: 290
Width: 85
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@LOCATION:
X: 480
X: 380
Width: 110
Height: 25
Label@STATUS:
X: 595
X: 495
Width: 50
Height: 25
Label@PROGRESS_LABEL:
@@ -132,12 +132,12 @@ Container@LOBBY_SERVERS_BIN:
Visible: false
DropDownButton@FILTERS_DROPDOWNBUTTON:
Y: PARENT_BOTTOM + 5
Width: 180
Width: 151
Height: 25
Text: Filter Games
Font: Bold
Button@RELOAD_BUTTON:
X: 185
X: 156
Y: PARENT_BOTTOM + 5
Width: 26
Height: 25

View File

@@ -2,7 +2,7 @@ Container@SERVER_LOBBY:
Logic: LobbyLogic
X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - 560) / 2
Width: 900
Width: 800
Height: 575
Children:
ColorPreviewManager@COLOR_MANAGER:
@@ -25,57 +25,55 @@ Container@SERVER_LOBBY:
DropDownButton@SLOTS_DROPDOWNBUTTON:
X: 15
Y: 254
Width: 211
Width: 182
Height: 25
Text: Slot Admin
Container@SKIRMISH_TABS:
X: 697 - WIDTH
Width: 465
Visible: False
Children:
Button@PLAYERS_TAB:
X: 202
Y: 248
Width: 151
Width: 129
Height: 31
Text: Players
Button@OPTIONS_TAB:
X: 157
X: 336
Y: 248
Width: 151
Width: 128
Height: 31
Text: Options
Button@MUSIC_TAB:
X: 314
X: 469
Y: 248
Width: 151
Width: 128
Height: 31
Text: Music
Container@MULTIPLAYER_TABS:
X: 697 - WIDTH
Width: 465
Visible: False
Children:
Button@PLAYERS_TAB:
X: 202
Y: 248
Width: 112
Width: 95
Height: 31
Text: Players
Button@OPTIONS_TAB:
X: 118
X: 302
Y: 248
Width: 112
Width: 95
Height: 31
Text: Options
Button@MUSIC_TAB:
X: 236
X: 402
Y: 248
Width: 112
Width: 95
Height: 31
Text: Music
Button@SERVERS_TAB:
X: 354
X: 502
Y: 248
Width: 111
Width: 95
Height: 31
Text: Servers
Button@CHANGEMAP_BUTTON:
@@ -87,7 +85,7 @@ Container@SERVER_LOBBY:
Container@TOP_PANELS_ROOT:
X: 15
Y: 30
Width: 682
Width: 582
Height: 219
Container@LOBBYCHAT:
X: 15

View File

@@ -2,7 +2,7 @@ Container@MAPCHOOSER_PANEL:
Logic: MapChooserLogic
X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - 560) / 2
Width: 900
Width: 800
Height: 575
Children:
Label@TITLE:
@@ -64,7 +64,7 @@ Container@MAPCHOOSER_PANEL:
ScrollPanel@MAP_LIST:
Width: PARENT_RIGHT
Height: PARENT_BOTTOM
ItemSpacing: 1
Children:
Container@USER_MAPS_TAB:
X: 15
Y: 45
@@ -74,18 +74,18 @@ Container@MAPCHOOSER_PANEL:
ScrollPanel@MAP_LIST:
Width: PARENT_RIGHT
Height: PARENT_BOTTOM
ItemSpacing: 1
Children:
ScrollItem@MAP_TEMPLATE:
Width: 210
Height: 262
X: 1
Width: 183
Height: 232
X: 2
Visible: false
Children:
MapPreview@PREVIEW:
X: (PARENT_RIGHT - WIDTH) / 2
Y: 3
Width: 204
Height: 204
Y: 4
Width: 173
Height: 173
IgnoreMouseOver: true
IgnoreMouseInput: true
Label@TITLE:

View File

@@ -2,7 +2,7 @@ Container@MULTIPLAYER_PANEL:
Logic: MultiplayerLogic
X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - 560) / 2
Width: 900
Width: 800
Height: 575
Children:
Label@TITLE:
@@ -25,25 +25,25 @@ Container@MULTIPLAYER_PANEL:
Children:
Label@NAME:
X: 5
Width: 355
Width: 255
Height: 25
Text: Server
Align: Center
Font: Bold
Label@PLAYERS:
X: 390
X: 290
Width: 85
Height: 25
Text: Players
Font: Bold
Label@LOCATION:
X: 480
X: 380
Width: 110
Height: 25
Text: Location
Font: Bold
Label@STATUS:
X: 595
X: 495
Width: 50
Height: 25
Text: Status
@@ -52,7 +52,7 @@ Container@MULTIPLAYER_PANEL:
Container@NOTICE_CONTAINER:
X: 15
Y: 30
Width: 682
Width: 582
Height: 19
Children:
Background@bg:
@@ -84,7 +84,7 @@ Container@MULTIPLAYER_PANEL:
ScrollPanel@SERVER_LIST:
X: 15
Y: 30
Width: 682
Width: 582
Height: PARENT_BOTTOM - 75
TopBottomSpacing: 2
Children:
@@ -107,12 +107,12 @@ Container@MULTIPLAYER_PANEL:
Children:
LabelWithTooltip@TITLE:
X: 5
Width: 345
Width: 245
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Image@PASSWORD_PROTECTED:
X: 372
X: 272
Y: 6
Width: 12
Height: 13
@@ -121,7 +121,7 @@ Container@MULTIPLAYER_PANEL:
TooltipTemplate: SIMPLE_TOOLTIP
TooltipText: Requires Password
Image@REQUIRES_AUTHENTICATION:
X: 372
X: 272
Y: 6
Width: 12
Height: 13
@@ -130,23 +130,23 @@ Container@MULTIPLAYER_PANEL:
TooltipTemplate: SIMPLE_TOOLTIP
TooltipText: Requires OpenRA forum account
LabelWithTooltip@PLAYERS:
X: 390
X: 290
Width: 85
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@LOCATION:
X: 480
X: 380
Width: 110
Height: 25
Label@STATUS:
X: 595
X: 495
Width: 50
Height: 25
Label@PROGRESS_LABEL:
X: 15
Y: 31 + (PARENT_BOTTOM - 75 - HEIGHT) / 2
Width: 682
Width: 582
Height: 25
Font: Bold
Align: Center
@@ -231,20 +231,20 @@ Container@MULTIPLAYER_PANEL:
Children:
LogicTicker@ANIMATION:
Label@PLAYER_COUNT:
X: 248
X: 198
Y: PARENT_BOTTOM - 40
Width: 189
Height: 25
Align: Center
Font: Bold
Button@DIRECTCONNECT_BUTTON:
X: 487
X: 387
Y: PARENT_BOTTOM - 40
Width: 100
Height: 25
Text: Direct IP
Button@CREATE_BUTTON:
X: 592
X: 492
Y: PARENT_BOTTOM - 40
Width: 105
Height: 25

View File

@@ -552,7 +552,7 @@ Actors:
Health: 99
Actor171: hosp
Location: 55,28
Owner: GDI
Owner: Civilians
Actor172: mtnk
Location: 51,40
Owner: GDI

View File

@@ -67,7 +67,7 @@ HELI:
TurnSpeed: 28
Speed: 180
Health:
HP: 12500
HP: 12000
Armor:
Type: Light
RevealsShroud:

View File

@@ -187,11 +187,6 @@
AttackMove:
AssaultMoveCondition: assault-move
^PlayerHandicaps:
HandicapFirepowerMultiplier:
HandicapDamageMultiplier:
HandicapProductionTimeMultiplier:
^AcceptsCloakCrate:
Cloak:
InitialDelay: 15
@@ -229,7 +224,6 @@
Inherits@1: ^ExistsInWorld
Inherits@3: ^ClassicFacingSpriteActor
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -275,7 +269,6 @@
Inherits@1: ^ExistsInWorld
Inherits@3: ^ClassicFacingSpriteActor
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -330,7 +323,6 @@
Inherits@1: ^ExistsInWorld
Inherits@3: ^SpriteActor
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -476,7 +468,6 @@
Notification: CivilianKilled
NotifyAll: true
ScaredyCat:
AvoidTerrainTypes: Tiberium, BlueTiberium
Crushable:
CrushSound: squish2.aud
Voiced:
@@ -484,7 +475,6 @@
Wanders:
MinMoveDelay: 150
MaxMoveDelay: 750
AvoidTerrainTypes: Tiberium, BlueTiberium
MapEditorData:
Categories: Civilian infantry
@@ -500,7 +490,6 @@
Inherits@2: ^SpriteActor
Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -555,12 +544,11 @@
Inherits@2: ^SpriteActor
Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Huntable:
Health:
HP: 40000
HP: 30000
Armor:
Type: Light
Type: Wood
RevealsShroud:
Range: 6c0
Mobile:
@@ -611,7 +599,6 @@
^Plane:
Inherits@1: ^ExistsInWorld
Inherits@2: ^ClassicFacingSpriteActor
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -637,7 +624,6 @@
Inherits@1: ^ExistsInWorld
Inherits@3: ^SpriteActor
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -665,7 +651,6 @@
Inherits@2: ^SpriteActor
Inherits@shape: ^1x1Shape
Inherits@selection: ^SelectableBuilding
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -681,8 +666,8 @@
ActorPreviewPlaceBuildingPreview:
OverridePalette: placebuilding
SoundOnDamageTransition:
DamagedSounds: xplobig4.aud
DestroyedSounds: crumble.aud, xplobig4.aud
DamagedSounds: xplos.aud
DestroyedSounds: crumble.aud
WithSpriteBody:
Explodes:
Type: Footprint
@@ -1005,9 +990,9 @@
Inherits@1: ^ClassicFacingSpriteActor
Interactable:
Health:
HP: 28000
HP: 14000
Armor:
Type: Heavy
Type: Light
HiddenUnderFog:
Type: CenterPosition
AlwaysVisibleRelationships: None
@@ -1042,14 +1027,14 @@
Sequence: 1
IsDecoration: True
ChangesHealth:
Step: -200
Step: -100
StartIfBelow: 101
Delay: 6
^LightHusk:
Inherits: ^Husk
Health:
HP: 4000
HP: 2000
^HelicopterHusk:
Inherits: ^CommonHuskDefaults

View File

@@ -80,9 +80,6 @@ HARV:
EffectiveOwnerFromOwner: true
WithHarvestAnimation:
WithDockingAnimation:
Explodes@EMPTY:
Weapon: UnitExplodeHarvEmpty
EmptyWeapon: UnitExplodeHarvEmpty
Explodes:
RequiresCondition: !no-tiberium
Weapon: TiberiumExplosion
@@ -163,9 +160,6 @@ APC:
Types: Infantry
MaxWeight: 5
LoadingCondition: notmobile
Explodes:
Weapon: UnitExplodeBig
EmptyWeapon: UnitExplodeBig
SpawnActorOnDeath:
Actor: APC.Husk
OwnerType: InternalName
@@ -460,9 +454,6 @@ MTNK:
AttackTurreted:
WithMuzzleOverlay:
WithSpriteTurret:
Explodes:
Weapon: UnitExplodeBig
EmptyWeapon: UnitExplodeBig
SpawnActorOnDeath:
Actor: MTNK.Husk
OwnerType: InternalName
@@ -521,9 +512,6 @@ HTNK:
Delay: 10
StartIfBelow: 50
DamageCooldown: 200
Explodes:
Weapon: UnitExplodeMech
EmptyWeapon: UnitExplodeMech
SpawnActorOnDeath:
Actor: HTNK.Husk
OwnerType: InternalName
@@ -572,9 +560,6 @@ MSAM:
TargetFrozenActors: True
ForceFireIgnoresActors: True
WithSpriteTurret:
Explodes:
Weapon: UnitExplodeMech
EmptyWeapon: UnitExplodeMech
SpawnActorOnDeath:
Actor: MSAM.Husk
OwnerType: InternalName
@@ -644,7 +629,7 @@ STNK:
Inherits@EXPERIENCE: ^GainsExperience
Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove
Valued:
Cost: 900
Cost: 1000
Tooltip:
Name: Stealth Tank
UpdatesPlayerStatistics:
@@ -663,7 +648,7 @@ STNK:
Health:
HP: 15000
Repairable:
HpPerStep: 758
HpPerStep: 682
Armor:
Type: Light
RevealsShroud:

View File

@@ -40,7 +40,6 @@
120mm:
Inherits: ^BallisticWeapon
Report: tnkfire4.aud
120mmDual:
Inherits: ^BallisticWeapon

View File

@@ -33,7 +33,7 @@ FlametankExplode:
DamageTypes: Prone50Percent, TriggerProne, FireDeath
Warhead@2Eff: CreateEffect
Explosions: big_napalm
ImpactSounds: flamer2.aud
ImpactSounds: xplobig6.aud
Warhead@3Smu: LeaveSmudge
SmudgeType: Scorch
@@ -74,26 +74,8 @@ UnitExplodeSmall:
Explosions: big_frag
ImpactSounds: xplobig4.aud
UnitExplodeBig:
Inherits: ^DamagingExplosionHE
Warhead@2Eff: CreateEffect
Explosions: big_frag
ImpactSounds: xplobig6.aud
UnitExplodeMech:
Inherits: ^DamagingExplosionHE
Warhead@2Eff: CreateEffect
Explosions: poof
ImpactSounds: xplosml2.aud
UnitExplodeHarvEmpty:
Inherits: ^DamagingExplosionHE
Warhead@2Eff: CreateEffect
Explosions: building
ImpactSounds: xplos.aud
UnitExplodeStealthTank:
Inherits: UnitExplodeBig
Inherits: UnitExplodeSmall
Warhead@1Dam: SpreadDamage
InvalidTargets: StealthTank

View File

@@ -65,7 +65,6 @@ Rockets:
BikeRockets:
Inherits: ^MissileWeapon
ReloadDelay: 60
Burst: 2
BurstDelays: 10
Projectile: Missile
@@ -130,7 +129,6 @@ MammothMissiles:
Heavy: 44
Warhead@3Eff: CreateEffect
Explosions: small_poof
ImpactSounds: xplobig4.aud
Warhead@4EffAir: CreateEffect
Explosions: small_building
@@ -165,7 +163,6 @@ MammothMissiles:
Heavy: 48
Warhead@3Eff: CreateEffect
Explosions: med_frag
ImpactSounds: xplobig4.aud
227mm.stnk:
Inherits: ^MissileWeapon
@@ -216,7 +213,6 @@ BoatMissile:
DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath
Warhead@3Eff: CreateEffect
Explosions: small_poof
ImpactSounds: xplobig4.aud
Warhead@4EffAir: CreateEffect
Explosions: small_building

View File

@@ -1,7 +1,7 @@
Sniper:
Report: ramgun2.aud
ValidTargets: Ground, Infantry
InvalidTargets: Vehicle, Water, Structure, Wall, Husk, Creep
InvalidTargets: Vehicle, Water, Structure, Wall, Husk
ReloadDelay: 40
Range: 8c0
Projectile: Bullet
@@ -72,7 +72,7 @@ HeliAGGun:
Damage: 2000
Versus:
None: 100
Wood: 75
Wood: 50
Light: 75
Heavy: 25
DamageTypes: Prone80Percent, TriggerProne, RippedApartDeath
@@ -175,6 +175,6 @@ APCGun.AA:
Warhead@1Dam: SpreadDamage
ValidTargets: Air
Versus:
Light: 125
Light: 140
Warhead@2Eff: CreateEffect
Explosions: small_poof

View File

@@ -20,13 +20,12 @@ Container@LOBBY_MUSIC_BIN:
Height: 25
Text: Track
Font: Bold
Label@LENGTH:
X: PARENT_RIGHT - 80
Label@TYPE:
X: PARENT_RIGHT - 63
Height: 25
Width: 50
Text: Length
Font: Bold
Align: Right
Background@CONTROLS:
Background: dialog3
Width: 268

View File

@@ -23,19 +23,19 @@ Container@LOBBY_OPTIONS_BIN:
Height: 30
Children:
Checkbox@A:
Width: 220
Width: 175
Height: 20
Visible: False
TooltipContainer: TOOLTIP_CONTAINER
Checkbox@B:
X: 225
Width: 220
X: 190
Width: 175
Height: 20
Visible: False
TooltipContainer: TOOLTIP_CONTAINER
Checkbox@C:
X: 450
Width: 190
X: 375
Width: 175
Height: 20
Visible: False
TooltipContainer: TOOLTIP_CONTAINER
@@ -44,25 +44,25 @@ Container@LOBBY_OPTIONS_BIN:
Width: PARENT_RIGHT
Children:
Label@A_DESC:
Width: 140
Width: 90
Height: 25
Align: Right
Visible: False
DropDownButton@A:
X: 145
Width: 180
X: 95
Width: 160
Height: 25
Visible: False
TooltipContainer: TOOLTIP_CONTAINER
Label@B_DESC:
X: PARENT_RIGHT - WIDTH - 203
Width: 140
X: PARENT_RIGHT - WIDTH - 183
Width: 160
Height: 25
Align: Right
Visible: False
DropDownButton@B:
X: PARENT_RIGHT - WIDTH - 18
Width: 180
Width: 160
Height: 25
Font: Regular
Visible: False

View File

@@ -23,34 +23,27 @@ Container@LOBBY_PLAYER_BIN:
Font: Bold
Label@LABEL_LOBBY_FACTION:
X: 270
Width: 140
Width: 130
Height: 25
Text: Faction
Align: Center
Font: Bold
Label@LABEL_LOBBY_TEAM:
X: 420
X: 410
Width: 48
Height: 25
Text: Team
Align: Center
Font: Bold
Label@LABEL_LOBBY_HANDICAP:
X: 478
Width: 72
Height: 25
Text: Handicap
Align: Center
Font: Bold
Label@LABEL_LOBBY_SPAWN:
X: 560
X: 468
Width: 48
Height: 25
Text: Spawn
Align: Center
Font: Bold
Label@LABEL_LOBBY_STATUS:
X: 617
X: 525
Width: 20
Height: 25
Text: Ready
@@ -125,7 +118,7 @@ Container@LOBBY_PLAYER_BIN:
Height: PARENT_BOTTOM - 12
DropDownButton@FACTION:
X: 270
Width: 140
Width: 130
Height: 25
IgnoreChildMouseOver: true
TooltipContainer: TOOLTIP_CONTAINER
@@ -142,29 +135,23 @@ Container@LOBBY_PLAYER_BIN:
Height: 25
Text: Faction
DropDownButton@TEAM_DROPDOWN:
X: 420
X: 410
Width: 48
Height: 25
Text: Team
DropDownButton@HANDICAP_DROPDOWN:
X: 478
Width: 72
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipText: A handicap decreases the combat effectiveness of the player's forces
DropDownButton@SPAWN_DROPDOWN:
X: 560
X: 468
Width: 48
Height: 25
Text: Spawn
Checkbox@STATUS_CHECKBOX:
X: 617
X: 525
Y: 2
Width: 20
Height: 20
Visible: false
Image@STATUS_IMAGE:
X: 619
X: 527
Y: 4
Width: 20
Height: 20
@@ -238,7 +225,7 @@ Container@LOBBY_PLAYER_BIN:
Height: 13
Container@FACTION:
X: 270
Width: 160
Width: 150
Height: 25
Children:
Image@FACTIONFLAG:
@@ -252,39 +239,28 @@ Container@LOBBY_PLAYER_BIN:
Height: 25
Text: Faction
Label@TEAM:
X: 420
X: 410
Width: 23
Height: 25
Text: Team
Align: Center
DropDownButton@TEAM_DROPDOWN:
X: 420
Width: 48
Height: 25
Visible: false
Label@HANDICAP:
X: 478
Width: 47
Height: 25
Align: Center
DropDownButton@HANDICAP_DROPDOWN:
X: 478
Width: 72
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipText: A handicap decreases the combat effectiveness of the player's forces
Label@SPAWN:
X: 560
X: 468
Width: 23
Height: 25
Align: Center
DropDownButton@TEAM_DROPDOWN:
X: 410
Width: 48
Height: 25
Visible: false
DropDownButton@SPAWN_DROPDOWN:
X: 560
X: 468
Width: 48
Height: 25
Visible: false
Image@STATUS_IMAGE:
X: 619
X: 527
Y: 4
Width: 20
Height: 20
@@ -311,7 +287,7 @@ Container@LOBBY_PLAYER_BIN:
Button@JOIN:
X: 190
Text: Play in this slot
Width: 418
Width: 326
Height: 25
Container@TEMPLATE_EDITABLE_SPECTATOR:
X: 5
@@ -357,19 +333,19 @@ Container@LOBBY_PLAYER_BIN:
Template: ANONYMOUS_PLAYER_TOOLTIP
Label@SPECTATOR:
X: 190
Width: 418
Width: 326
Height: 25
Text: Spectator
Align: Center
Font: Bold
Checkbox@STATUS_CHECKBOX:
X: 617
X: 525
Y: 2
Width: 20
Height: 20
Visible: false
Image@STATUS_IMAGE:
X: 619
X: 527
Y: 4
Width: 20
Height: 20
@@ -438,13 +414,13 @@ Container@LOBBY_PLAYER_BIN:
Template: ANONYMOUS_PLAYER_TOOLTIP
Label@SPECTATOR:
X: 190
Width: 418
Width: 326
Height: 25
Text: Spectator
Align: Center
Font: Bold
Image@STATUS_IMAGE:
X: 619
X: 527
Y: 4
Width: 20
Height: 20
@@ -465,7 +441,7 @@ Container@LOBBY_PLAYER_BIN:
Text: Allow Spectators?
Button@SPECTATE:
X: 190
Width: 418
Width: 326
Height: 25
Text: Spectate
Font: Regular

View File

@@ -9,32 +9,32 @@ Container@LOBBY_SERVERS_BIN:
Children:
Label@NAME:
X: 5
Width: 347
Width: 255
Height: 25
Text: Server
Align: Center
Font: Bold
Label@PLAYERS:
X: 382
X: 290
Width: 85
Height: 25
Text: Players
Font: Bold
Label@LOCATION:
X: 472
X: 380
Width: 110
Height: 25
Text: Location
Font: Bold
Label@STATUS:
X: 587
X: 495
Width: 50
Height: 25
Text: Status
Font: Bold
LogicTicker@NOTICE_WATCHER:
Background@NOTICE_CONTAINER:
Width: PARENT_RIGHT
Width: 583
Height: 20
Background: dialog2
Children:
@@ -83,12 +83,12 @@ Container@LOBBY_SERVERS_BIN:
Children:
LabelWithTooltip@TITLE:
X: 5
Width: 337
Width: 245
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Image@PASSWORD_PROTECTED:
X: 364
X: 272
Y: 6
Width: 12
Height: 13
@@ -97,7 +97,7 @@ Container@LOBBY_SERVERS_BIN:
TooltipTemplate: SIMPLE_TOOLTIP
TooltipText: Requires Password
Image@REQUIRES_AUTHENTICATION:
X: 364
X: 272
Y: 6
Width: 12
Height: 13
@@ -106,17 +106,17 @@ Container@LOBBY_SERVERS_BIN:
TooltipTemplate: SIMPLE_TOOLTIP
TooltipText: Requires OpenRA forum account
LabelWithTooltip@PLAYERS:
X: 382
X: 290
Width: 85
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@LOCATION:
X: 472
X: 380
Width: 110
Height: 25
Label@STATUS:
X: 587
X: 495
Width: 50
Height: 25
Label@PROGRESS_LABEL:
@@ -128,12 +128,12 @@ Container@LOBBY_SERVERS_BIN:
Visible: false
DropDownButton@FILTERS_DROPDOWNBUTTON:
Y: PARENT_BOTTOM + 5
Width: 154
Width: 147
Height: 25
Text: Filter Games
Font: Bold
Button@RELOAD_BUTTON:
X: 159
X: 152
Y: PARENT_BOTTOM + 5
Width: 26
Height: 25

View File

@@ -2,7 +2,7 @@ Background@SERVER_LOBBY:
Logic: LobbyLogic
X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - HEIGHT) / 2
Width: 900
Width: 808
Height: 600
Children:
ColorPreviewManager@COLOR_MANAGER:
@@ -20,71 +20,69 @@ Background@SERVER_LOBBY:
DropDownButton@SLOTS_DROPDOWNBUTTON:
X: 20
Y: 291
Width: 185
Width: 178
Height: 25
Font: Bold
Text: Slot Admin
Container@SKIRMISH_TABS:
X: 695 - WIDTH
Width: 486
Visible: False
Children:
Button@PLAYERS_TAB:
X: 203
Y: 285
Width: 162
Width: 134
Height: 31
Font: Bold
Text: Players
Button@OPTIONS_TAB:
X: 162
X: 337
Y: 285
Width: 162
Width: 133
Height: 31
Font: Bold
Text: Options
Button@MUSIC_TAB:
X: 2*162
X: 470
Y: 285
Width: 162
Width: 133
Height: 31
Font: Bold
Text: Music
Container@MULTIPLAYER_TABS:
X: 695 - WIDTH
Width: 486
Visible: False
Children:
Button@PLAYERS_TAB:
X: 203
Y: 285
Width: 121
Width: 100
Height: 31
Font: Bold
Text: Players
Button@OPTIONS_TAB:
X: 121
X: 303
Y: 285
Width: 122
Width: 100
Height: 31
Font: Bold
Text: Options
Button@MUSIC_TAB:
X: 243
X: 403
Y: 285
Width: 121
Width: 100
Height: 31
Font: Bold
Text: Music
Button@SERVERS_TAB:
X: 364
X: 503
Y: 285
Width: 122
Width: 100
Height: 31
Font: Bold
Text: Servers
Container@TOP_PANELS_ROOT:
X: 20
Y: 67
Width: 675
Width: 583
Height: 219
Button@CHANGEMAP_BUTTON:
X: PARENT_RIGHT - WIDTH - 20

View File

@@ -2,7 +2,7 @@ Background@MAPCHOOSER_PANEL:
X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - HEIGHT) / 2
Logic: MapChooserLogic
Width: 900
Width: 808
Height: 600
Children:
Label@MAPCHOOSER_TITLE:
@@ -47,16 +47,16 @@ Background@MAPCHOOSER_PANEL:
Height: PARENT_BOTTOM
Children:
ScrollItem@MAP_TEMPLATE:
Width: 208
Height: 266
Width: 185
Height: 243
X: 2
Visible: false
Children:
MapPreview@PREVIEW:
X: (PARENT_RIGHT - WIDTH) / 2
Y: 3
Width: 202
Height: 202
Width: 179
Height: 179
IgnoreMouseOver: true
IgnoreMouseInput: true
Label@TITLE:

View File

@@ -2,7 +2,7 @@ Background@MULTIPLAYER_PANEL:
Logic: MultiplayerLogic
X: (WINDOW_RIGHT - WIDTH) / 2
Y: (WINDOW_BOTTOM - HEIGHT) / 2
Width: 900
Width: 808
Height: 600
Children:
Label@TITLE:
@@ -20,25 +20,25 @@ Background@MULTIPLAYER_PANEL:
Children:
Label@NAME:
X: 5
Width: 347
Width: 255
Height: 25
Text: Server
Align: Center
Font: Bold
Label@PLAYERS:
X: 382
X: 290
Width: 85
Height: 25
Text: Players
Font: Bold
Label@LOCATION:
X: 472
X: 380
Width: 110
Height: 25
Text: Location
Font: Bold
Label@STATUS:
X: 587
X: 495
Width: 50
Height: 25
Text: Status
@@ -47,7 +47,7 @@ Background@MULTIPLAYER_PANEL:
Background@NOTICE_CONTAINER:
X: 20
Y: 67
Width: 675
Width: 583
Height: 20
Background: dialog2
Children:
@@ -75,7 +75,7 @@ Background@MULTIPLAYER_PANEL:
ScrollPanel@SERVER_LIST:
X: 20
Y: 67
Width: 675
Width: 583
Height: PARENT_BOTTOM - 119
TopBottomSpacing: 2
Children:
@@ -99,12 +99,12 @@ Background@MULTIPLAYER_PANEL:
Children:
LabelWithTooltip@TITLE:
X: 5
Width: 337
Width: 245
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Image@PASSWORD_PROTECTED:
X: 364
X: 272
Y: 6
Width: 12
Height: 13
@@ -113,7 +113,7 @@ Background@MULTIPLAYER_PANEL:
TooltipTemplate: SIMPLE_TOOLTIP
TooltipText: Requires Password
Image@REQUIRES_AUTHENTICATION:
X: 364
X: 272
Y: 6
Width: 12
Height: 13
@@ -122,23 +122,23 @@ Background@MULTIPLAYER_PANEL:
TooltipTemplate: SIMPLE_TOOLTIP
TooltipText: Requires OpenRA forum account
LabelWithTooltip@PLAYERS:
X: 382
X: 290
Width: 85
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipTemplate: SIMPLE_TOOLTIP
Label@LOCATION:
X: 472
X: 380
Width: 110
Height: 25
Label@STATUS:
X: 587
X: 495
Width: 50
Height: 25
Label@PROGRESS_LABEL:
X: 20
Y: 67 + (PARENT_BOTTOM - 119 - HEIGHT) / 2
Width: 675
Width: 582
Height: 25
Font: Bold
Align: Center
@@ -225,21 +225,21 @@ Background@MULTIPLAYER_PANEL:
Children:
LogicTicker@ANIMATION:
Label@PLAYER_COUNT:
X: 254
X: 208
Y: PARENT_BOTTOM - HEIGHT - 20
Width: 190
Height: 25
Align: Center
Font: Bold
Button@DIRECTCONNECT_BUTTON:
X: 490
X: 398
Y: PARENT_BOTTOM - HEIGHT - 20
Width: 100
Height: 25
Text: Direct IP
Font: Bold
Button@CREATE_BUTTON:
X: 595
X: 503
Y: PARENT_BOTTOM - HEIGHT - 20
Width: 100
Height: 25

View File

@@ -188,19 +188,12 @@ Background@SETTINGS_PANEL:
Font: Regular
Text: Increase Cursor Size
Checkbox@PLAYER_STANCE_COLORS_CHECKBOX:
X: 195
X: 310
Y: 133
Width: 200
Height: 20
Font: Regular
Text: Player Stance Colors
Checkbox@PAUSE_SHELLMAP_CHECKBOX:
X: 375
Y: 133
Width: 200
Height: 20
Font: Regular
Text: Pause Menu Background
Label@VIDEO_TITLE:
Y: 190
Width: PARENT_RIGHT

View File

@@ -62,10 +62,10 @@ Speech:
Sounds:
DefaultVariant: .WAV
Notifications:
RadarUp: RADRON1
RadarUp: MULTI1
RadarDown:
DisablePower: POWRDN1
EnablePower: POWRUP1
DisablePower: POWRUP1
EnablePower: POWRDN1
CashTickUp: CASHTIK1
CashTickDown: CASHTIK1
LevelUp: SCORTIK1

View File

@@ -23,34 +23,27 @@ Container@LOBBY_PLAYER_BIN:
Font: Bold
Label@LABEL_LOBBY_FACTION:
X: 270
Width: 140
Width: 130
Height: 25
Text: Faction
Align: Center
Font: Bold
Label@LABEL_LOBBY_TEAM:
X: 420
X: 410
Width: 48
Height: 25
Text: Team
Align: Center
Font: Bold
Label@LABEL_LOBBY_HANDICAP:
X: 478
Width: 72
Height: 25
Text: Handicap
Align: Center
Font: Bold
Label@LABEL_LOBBY_SPAWN:
X: 560
X: 468
Width: 48
Height: 25
Text: Spawn
Align: Center
Font: Bold
Label@LABEL_LOBBY_STATUS:
X: 617
X: 525
Width: 20
Height: 25
Text: Ready
@@ -125,7 +118,7 @@ Container@LOBBY_PLAYER_BIN:
Height: PARENT_BOTTOM - 12
DropDownButton@FACTION:
X: 270
Width: 140
Width: 130
Height: 25
IgnoreChildMouseOver: true
TooltipContainer: TOOLTIP_CONTAINER
@@ -142,29 +135,23 @@ Container@LOBBY_PLAYER_BIN:
Height: 25
Text: Faction
DropDownButton@TEAM_DROPDOWN:
X: 420
X: 410
Width: 48
Height: 25
Text: Team
DropDownButton@HANDICAP_DROPDOWN:
X: 478
Width: 72
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipText: A handicap decreases the combat effectiveness of the player's forces
DropDownButton@SPAWN_DROPDOWN:
X: 560
X: 468
Width: 48
Height: 25
Text: Spawn
Checkbox@STATUS_CHECKBOX:
X: 617
X: 525
Y: 2
Width: 20
Height: 20
Visible: false
Image@STATUS_IMAGE:
X: 619
X: 527
Y: 4
Width: 20
Height: 20
@@ -238,7 +225,7 @@ Container@LOBBY_PLAYER_BIN:
Height: 13
Container@FACTION:
X: 270
Width: 170
Width: 160
Height: 25
Children:
Image@FACTIONFLAG:
@@ -248,43 +235,32 @@ Container@LOBBY_PLAYER_BIN:
Height: 23
Label@FACTIONNAME:
X: 34
Width: 70
Width: 60
Height: 25
Text: Faction
Label@TEAM:
X: 420
X: 410
Width: 23
Height: 25
Align: Center
Text: Team
DropDownButton@TEAM_DROPDOWN:
X: 420
Width: 48
Height: 25
Visible: false
Label@HANDICAP:
X: 478
Width: 47
Height: 25
Align: Center
DropDownButton@HANDICAP_DROPDOWN:
X: 478
Width: 72
Height: 25
TooltipContainer: TOOLTIP_CONTAINER
TooltipText: A handicap decreases the combat effectiveness of the player's forces
Label@SPAWN:
X: 560
X: 468
Width: 23
Height: 25
Align: Center
DropDownButton@TEAM_DROPDOWN:
X: 410
Width: 48
Height: 25
Visible: false
DropDownButton@SPAWN_DROPDOWN:
X: 560
X: 468
Width: 48
Height: 25
Visible: false
Image@STATUS_IMAGE:
X: 619
X: 527
Y: 4
Width: 20
Height: 20
@@ -310,7 +286,7 @@ Container@LOBBY_PLAYER_BIN:
Visible: false
Button@JOIN:
X: 190
Width: 418
Width: 326
Height: 25
Text: Play in this slot
Container@TEMPLATE_EDITABLE_SPECTATOR:
@@ -357,19 +333,19 @@ Container@LOBBY_PLAYER_BIN:
Template: ANONYMOUS_PLAYER_TOOLTIP
Label@SPECTATOR:
X: 190
Width: 418
Width: 326
Height: 25
Text: Spectator
Align: Center
Font: Bold
Checkbox@STATUS_CHECKBOX:
X: 617
X: 525
Y: 2
Width: 20
Height: 20
Visible: false
Image@STATUS_IMAGE:
X: 619
X: 527
Y: 4
Width: 20
Height: 20
@@ -438,13 +414,13 @@ Container@LOBBY_PLAYER_BIN:
Template: ANONYMOUS_PLAYER_TOOLTIP
Label@SPECTATOR:
X: 190
Width: 418
Width: 326
Height: 25
Text: Spectator
Align: Center
Font: Bold
Image@STATUS_IMAGE:
X: 619
X: 527
Y: 4
Width: 20
Height: 20
@@ -465,7 +441,7 @@ Container@LOBBY_PLAYER_BIN:
Font: Regular
Button@SPECTATE:
X: 190
Width: 418
Width: 326
Height: 25
Text: Spectate
Font: Regular

View File

@@ -147,10 +147,8 @@ speed = 5
Tick = function()
ticks = ticks + 1
if ticks > 1 or not Map.IsPausedShellmap then
local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed;
Camera.Position = viewportOrigin + WVec.New(19200 * math.sin(t), 28800 * math.cos(t), 0)
end
local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed;
Camera.Position = viewportOrigin + WVec.New(19200 * math.sin(t), 28800 * math.cos(t), 0)
end
WorldLoaded = function()

View File

@@ -249,7 +249,7 @@ ModContent:
Required: true
Download: patch106
music: Game Music
TestFiles: ^SupportDir|Content/d2k/v2/Music/AMBUSH.AUD, ^SupportDir|Content/d2k/v2/Music/WAITGAME.AUD
TestFiles: ^SupportDir|Content/d2k/v2/Music/AMBUSH.AUD
Sources: d2k-a, d2k-a-linux, d2k-b, d2k-b-linux, d2k-c, d2k-c-linux, d2k-d, d2k-d-linux, d2k-e, d2k-e-linux, gruntmods
movies: Campaign Briefings
TestFiles: ^SupportDir|Content/d2k/v2/Movies/A_BR01_E.VQA

View File

@@ -219,7 +219,7 @@ Player:
RequiresCondition: enable-omnius-ai
SquadSize: 8
MaxBaseRadius: 40
ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce
ExcludeFromSquadsTypes: harvester, mcv, carryall
ConstructionYardTypes: construction_yard
IgnoredEnemyTargetTypes: Creep
UnitBuilderBotModule@omnius:
@@ -263,7 +263,7 @@ Player:
RequiresCondition: enable-vidious-ai
SquadSize: 6
MaxBaseRadius: 40
ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce
ExcludeFromSquadsTypes: harvester, mcv
ConstructionYardTypes: construction_yard
IgnoredEnemyTargetTypes: Creep
UnitBuilderBotModule@vidious:
@@ -302,7 +302,7 @@ Player:
RequiresCondition: enable-gladius-ai
SquadSize: 10
MaxBaseRadius: 40
ExcludeFromSquadsTypes: harvester, mcv, carryall, carryall.reinforce
ExcludeFromSquadsTypes: harvester, mcv
ConstructionYardTypes: construction_yard
IgnoredEnemyTargetTypes: Creep
UnitBuilderBotModule@gladius:

View File

@@ -184,16 +184,10 @@
AttackMoveCondition: attack-move
AssaultMoveCondition: assault-move
^PlayerHandicaps:
HandicapFirepowerMultiplier:
HandicapDamageMultiplier:
HandicapProductionTimeMultiplier:
^Vehicle:
Inherits@1: ^ExistsInWorld
Inherits@2: ^SpriteActor
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Tooltip:
GenericName: Unit
Huntable:
@@ -304,7 +298,6 @@
Inherits@2: ^GainsExperience
Inherits@3: ^SpriteActor
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Tooltip:
GenericName: Unit
Huntable:
@@ -373,7 +366,6 @@
^Plane:
Inherits@1: ^ExistsInWorld
Inherits@2: ^SpriteActor
Inherits@handicaps: ^PlayerHandicaps
Interactable:
Tooltip:
GenericName: Unit
@@ -399,7 +391,6 @@
Inherits@1: ^ExistsInWorld
Inherits@2: ^SpriteActor
Inherits@selection: ^SelectableBuilding
Inherits@handicaps: ^PlayerHandicaps
Tooltip:
GenericName: Structure
Huntable:

View File

@@ -39,7 +39,6 @@ Fremen_S:
M_LMG:
Inherits: ^MG
ReloadDelay: 40
ValidTargets: Infantry
M_LMG_H:
Inherits: M_LMG
@@ -50,7 +49,6 @@ M_HMG:
ReloadDelay: 40
Range: 3c512
Report: 20MMGUN1.WAV
InvalidTargets: Infantry
Warhead@1Dam: SpreadDamage
Damage: 2500
Spread: 512

View File

@@ -46,9 +46,9 @@ MedicVoice:
MechanicVoice:
Voices:
Select: mhuh1,mhowdy1,mlaff1
Move: mboss1,mhear1,myes1,mrise1
Action: mhotdig1,mwrench1,myeehaw1
Select: mhuh1,mhowdy1,myes1,mrise1
Move: mboss1,mhear1
Action: mhotdig1,mwrench1
Die: dedman1,dedman2,dedman3,dedman4,dedman5,dedman7,dedman8
Burned: dedman10
Zapped: dedman6
@@ -117,8 +117,8 @@ EinsteinVoice:
ShokVoice:
Voices:
Select: jjuice1,jjump1,jyes1
Move: jdance1,jchrge1,jpower1
Select: jchrge1,jjuice1,jjump1,jpower1
Move: jdance1,jyes1
Attack: jburn1,jcrisp1,jshock1,jlight1
Die: dedman1,dedman2,dedman3,dedman4,dedman5,dedman7,dedman8
Burned: dedman10

View File

@@ -320,7 +320,7 @@ dialog4:
# completely black tile
dialog5:
Inherits: ^Dialog
PanelRegion: 580, 388, 0, 0, 62, 62, 0, 0
PanelRegion: 579, 387, 0, 0, 64, 64, 0, 0
PanelSides: Center
lobby-bits:

View File

@@ -329,11 +329,7 @@ InitTriggers = function()
end
end)
Trigger.OnKilled(SamBarrel, function()
if not Sam1.IsDead then
Sam1.Kill()
end
end)
Trigger.OnKilled(SamBarrel, Sam1.Kill)
Trigger.OnAllKilled(SamSites, function()
greece.MarkCompletedObjective(KillSams)

View File

@@ -1,8 +1,7 @@
PrisonColt:
ValidTargets: Ground, GroundActor
ReloadDelay: 7
ReloadDelay: 5
Report: gun5.aud
Projectile: InstantHit
Warhead@1Dam: SpreadDamage
AffectsParent: true
ValidTargets: Ground, GroundActor

View File

@@ -58,7 +58,7 @@ CreateKosygin = function()
Media.PlaySpeechNotification(Greece, "ObjectiveMet")
local kosygin = Actor.Create(KosyginType, true, { Location = KosyginSpawnPoint.Location, Owner = Greece })
Trigger.OnKilled(kosygin, RescueFailed)
ExtractObjective = Greece.AddObjective("Extract Kosygin and\nget him back to your base.")
ExtractObjective = Greece.AddPrimaryObjective("Extract Kosygin and\nget him back to your base.")
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(Greece, "TargetFreed") end)
end
@@ -168,9 +168,9 @@ WorldLoaded = function()
Greece = Player.GetPlayer("Greece")
USSR = Player.GetPlayer("USSR")
Camera.Position = DefaultCameraPosition.CenterPosition
UseSpyObjective = Greece.AddObjective("Infiltrate the Soviet command center and\ncontact Kosygin.")
KosyginSurviveObjective = Greece.AddObjective("Kosygin must survive.")
USSRObj = USSR.AddObjective("Eliminate all Allied forces.")
UseSpyObjective = Greece.AddPrimaryObjective("Infiltrate the Soviet command center and\ncontact Kosygin.")
KosyginSurviveObjective = Greece.AddPrimaryObjective("Kosygin must survive.")
USSRObj = USSR.AddPrimaryObjective("Eliminate all Allied forces.")
Trigger.OnPlayerLost(Greece, MissionFailed)
Trigger.OnPlayerWon(Greece, MissionAccomplished)
InitialAlliedReinforcements()

View File

@@ -73,9 +73,16 @@ SovietAirfields =
SovietAirfield5, SovietAirfield6, SovietAirfield7, SovietAirfield8
}
MountainEntry = { CPos.New(25, 45), CPos.New(25, 46), CPos.New(25, 47), CPos.New(25, 48), CPos.New(25, 49) }
MountainEntry =
{
MountainEntry1.Location, MountainEntry2.Location, MountainEntry3.Location, MountainEntry4.Location,
MountainEntry5.Location, MountainEntry6.Location, MountainEntry7.Location, MountainEntry8.Location
}
BridgeEntry = { CPos.New(25, 29), CPos.New(26, 29), CPos.New(27, 29), CPos.New(28, 29) }
BridgeEntry =
{
BridgeEntry1.Location, BridgeEntry2.Location, BridgeEntry3.Location, BridgeEntry4.Location
}
MobileConstructionVehicle = { "mcv" }
Yak = { "yak" }

Binary file not shown.

View File

@@ -51,17 +51,17 @@ Players:
Enemies: Soviets
PlayerReference@Allies:
Name: Allies
Bot: campaign
Faction: allies
Color: 5CC1A3
Allies: Allies1, Allies2
Enemies: Soviets
Bot: campaign
PlayerReference@Soviets:
Name: Soviets
Bot: campaign
Faction: soviet
Color: FE1100
Enemies: Allies1, Allies2
Bot: campaign
Actors:
Actor239: dog
@@ -871,6 +871,9 @@ Actors:
Actor6: gun
Location: 28,44
Owner: Allies
Actor47: powr
Location: 3,37
Owner: Allies
Actor45: 2tnk
Location: 28,28
Owner: Allies
@@ -889,6 +892,9 @@ Actors:
Actor40: e1
Location: 24,30
Owner: Allies
Actor46: powr
Location: 1,37
Owner: Allies
Actor49: fenc
Location: 28,27
Owner: Allies
@@ -985,6 +991,12 @@ Actors:
Actor167: barl
Location: 173,24
Owner: Neutral
Actor168: powr
Location: 1,34
Owner: Allies
Actor183: powr
Location: 3,34
Owner: Allies
Actor185: apwr
Location: 154,72
Owner: Soviets
@@ -1378,8 +1390,44 @@ Actors:
ParadropBoxTopLeft: waypoint
Location: 78,27
Owner: Neutral
MountainEntry1: waypoint
Location: 25,44
Owner: Neutral
MountainEntry2: waypoint
Owner: Neutral
Location: 25,45
MountainEntry3: waypoint
Owner: Neutral
Location: 25,46
MountainEntry4: waypoint
Owner: Neutral
Location: 25,47
MountainEntry5: waypoint
Owner: Neutral
Location: 25,48
MountainEntry6: waypoint
Owner: Neutral
Location: 25,49
MountainEntry7: waypoint
Location: 25,50
Owner: Neutral
MountainEntry8: waypoint
Owner: Neutral
Location: 25,51
BridgeEntry1: waypoint
Owner: Neutral
Location: 28,29
BridgeEntry2: waypoint
Owner: Neutral
Location: 27,29
BridgeEntry3: waypoint
Owner: Neutral
Location: 26,29
BridgeEntry4: waypoint
Owner: Neutral
Location: 25,29
SovietIntel: camera.large
Owner: Soviets
Location: 130,45
Location: 130, 45
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml

View File

@@ -24,8 +24,8 @@ Players:
OwnsWorld: True
NonCombatant: True
Faction: allies
PlayerReference@England:
Name: England
PlayerReference@Greece:
Name: Greece
Faction: allies
Color: A0F08C
Allies: GreekCivilians, Allies
@@ -41,87 +41,87 @@ Players:
Color: ABB7E4
LockSpawn: True
LockTeam: True
Allies: England
Allies: Greece
Enemies: USSR, BadGuy
PlayerReference@GreekCivilians:
Name: GreekCivilians
NonCombatant: True
Faction: allies
Allies: England
Allies: Greece
PlayerReference@USSR:
Name: USSR
Faction: soviet
Color: FF1400
Allies: BadGuy
Enemies: England, GreekCivilians, Allies
Enemies: Greece, GreekCivilians, Allies
PlayerReference@BadGuy:
Name: BadGuy
Faction: soviet
Color: FF1400
Allies: USSR
Enemies: England, GreekCivilians, Allies
Enemies: Greece, GreekCivilians, Allies
Actors:
Actor0: brik
Location: 97,44
Owner: England
Owner: Greece
Actor1: brik
Location: 98,44
Owner: England
Owner: Greece
Actor2: brik
Location: 101,44
Owner: England
Owner: Greece
Actor3: brik
Location: 102,44
Owner: England
Owner: Greece
Actor4: brik
Location: 97,45
Owner: England
Owner: Greece
Actor5: brik
Location: 98,45
Owner: England
Owner: Greece
Actor6: brik
Location: 99,45
Owner: England
Owner: Greece
Actor7: brik
Location: 100,45
Owner: England
Owner: Greece
Actor8: brik
Location: 101,45
Owner: England
Owner: Greece
Actor9: brik
Location: 102,45
Owner: England
Owner: Greece
Actor10: brik
Location: 82,49
Owner: England
Owner: Greece
Actor11: brik
Location: 83,49
Owner: England
Owner: Greece
Actor12: brik
Location: 86,49
Owner: England
Owner: Greece
Actor13: brik
Location: 87,49
Owner: England
Owner: Greece
Actor16: brik
Location: 82,50
Owner: England
Owner: Greece
Actor17: brik
Location: 83,50
Owner: England
Owner: Greece
Actor18: brik
Location: 84,50
Owner: England
Owner: Greece
Actor19: brik
Location: 85,50
Owner: England
Owner: Greece
Actor20: brik
Location: 86,50
Owner: England
Owner: Greece
Actor21: brik
Location: 87,50
Owner: England
Owner: Greece
Actor14: brik
Location: 27,50
Owner: USSR
@@ -535,65 +535,65 @@ Actors:
Owner: Neutral
Actor391: flare
Location: 81,41
Owner: England
Owner: Greece
Actor157: apwr
Location: 89,40
Owner: England
Owner: Greece
Actor158: tent
Location: 89,43
Owner: England
Owner: Greece
Actor159: pbox
Location: 88,50
Owner: England
Owner: Greece
Actor160: pbox
Location: 96,45
Owner: England
Owner: Greece
Actor161: gun
Location: 92,47
Owner: England
Owner: Greece
Facing: 636
Actor162: v19
Location: 101,42
Owner: England
Owner: Greece
Actor163: brl3
Location: 102,41
Owner: England
Owner: Greece
Actor164: brl3
Location: 101,41
Owner: England
Owner: Greece
Actor165: barl
Location: 100,40
Owner: England
Owner: Greece
Actor166: brl3
Location: 99,39
Owner: England
Owner: Greece
Actor167: barl
Location: 98,39
Owner: England
Owner: Greece
Actor168: v19
Location: 97,39
Owner: England
Owner: Greece
Actor169: brl3
Location: 96,39
Owner: England
Owner: Greece
Actor170: barl
Location: 95,40
Owner: England
Owner: Greece
Actor171: barl
Location: 102,43
Owner: England
Owner: Greece
Actor172: brl3
Location: 100,44
Owner: England
Owner: Greece
Actor173: brl3
Location: 97,40
Owner: England
Owner: Greece
Actor174: brl3
Location: 98,40
Owner: England
Owner: Greece
Actor175: barl
Location: 102,42
Owner: England
Owner: Greece
Church: v01
Location: 93,70
Owner: GreekCivilians
@@ -656,16 +656,16 @@ Actors:
Owner: USSR
Actor193: brl3
Location: 99,43
Owner: England
Owner: Greece
Actor194: barl
Location: 98,43
Owner: England
Owner: Greece
CivBarrel: barl
Location: 94,40
Owner: England
Owner: Greece
Actor196: brl3
Location: 101,43
Owner: England
Owner: Greece
SovFact: fact
Location: 31,59
Owner: USSR
@@ -734,16 +734,16 @@ Actors:
Owner: USSR
Actor218: apwr
Location: 80,46
Owner: England
Owner: Greece
Actor219: dome
Location: 84,47
Owner: England
Owner: Greece
BridgeBarrel1: brl3
Location: 85,42
Owner: England
Owner: Greece
Actor221: barl
Location: 85,41
Owner: England
Owner: Greece
Actor222: v19
Location: 68,57
Owner: Neutral
@@ -882,7 +882,7 @@ Actors:
Facing: 508
FlareBoy: e1
Location: 75,87
Owner: England
Owner: Greece
Facing: 380
SubCell: 2
Actor268: e1
@@ -1305,6 +1305,6 @@ Actors:
Owner: Neutral
Location: 22,39
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, rules.yaml
Weapons: weapons.yaml

View File

@@ -59,7 +59,7 @@ MissionStart = function()
FlareBoy.Move(LightFlare.Location)
Trigger.OnEnteredFootprint({ LightFlare.Location }, function(actor, id)
if actor.Owner == England then
if actor.Owner == Greece then
Trigger.RemoveFootprintTrigger(id)
local insertionFlare = Actor.Create("flare", true, { Owner = Allies, Location = LightFlare.Location })
Trigger.AfterDelay(DateTime.Seconds(2), function()
@@ -117,7 +117,7 @@ FootprintTriggers = function()
end
end)
DoomedHeli = Reinforcements.ReinforceWithTransport(England, ExtractionHelicopterType, nil, DoomedHeliPath)[1]
DoomedHeli = Reinforcements.ReinforceWithTransport(Greece, ExtractionHelicopterType, nil, DoomedHeliPath)[1]
end
end)
@@ -152,7 +152,7 @@ FootprintTriggers = function()
end)
if not GuideHut.IsDead then
local guide = Actor.Create("c6", true, { Owner = England, Location = GuideSpawn.Location })
local guide = Actor.Create("c6", true, { Owner = Greece, Location = GuideSpawn.Location })
guide.Move(SafePath1.Location)
guide.Move(SafePath2.Location)
guide.Move(CivilianRally.Location)
@@ -174,8 +174,8 @@ FootprintTriggers = function()
foot4Triggered = true
Trig4House.Owner = Civilians
Reinforcements.Reinforce(England, CivilianSquad1, { CivFlee1.Location, CivilianRally.Location }, 0)
Reinforcements.Reinforce(England, CivilianSquad2, { CivFlee2.Location, CivilianRally.Location }, 0)
Reinforcements.Reinforce(Greece, CivilianSquad1, { CivFlee1.Location, CivilianRally.Location }, 0)
Reinforcements.Reinforce(Greece, CivilianSquad2, { CivFlee2.Location, CivilianRally.Location }, 0)
end
end)
@@ -208,7 +208,7 @@ FootprintTriggers = function()
Trigger.AfterDelay(DateTime.Seconds(20), function()
Media.PlaySoundNotification(Allies, "AlertBuzzer")
Media.DisplayMessage("Extraction point is compromised. Evacuate the base!", "Headquarters")
local defenders = Reinforcements.Reinforce(England, TentTeam, { Tent.Location, TentMove.Location }, 0)
local defenders = Reinforcements.Reinforce(Greece, TentTeam, { Tent.Location, TentMove.Location }, 0)
Utils.Do(defenders, IdleHunt)
if Map.LobbyOption("difficulty") == "hard" then
Trigger.AfterDelay(DateTime.Seconds(30), function()
@@ -276,10 +276,10 @@ FootprintTriggers = function()
end)
Trigger.AfterDelay(DateTime.Seconds(26), function()
Reinforcements.Reinforce(England, CivilianSquad1, { House1.Location, TacticalNuke3.Location }, 0)
Reinforcements.Reinforce(England, CivilianSquad2, { House2.Location, TacticalNuke3.Location }, 0)
Reinforcements.Reinforce(England, CivilianSquad1, { House3.Location, TacticalNuke3.Location }, 0)
Reinforcements.Reinforce(England, CivilianSquad2, { House4.Location, TacticalNuke3.Location }, 0)
Reinforcements.Reinforce(Greece, CivilianSquad1, { House1.Location, TacticalNuke3.Location }, 0)
Reinforcements.Reinforce(Greece, CivilianSquad2, { House2.Location, TacticalNuke3.Location }, 0)
Reinforcements.Reinforce(Greece, CivilianSquad1, { House3.Location, TacticalNuke3.Location }, 0)
Reinforcements.Reinforce(Greece, CivilianSquad2, { House4.Location, TacticalNuke3.Location }, 0)
end)
Trigger.AfterDelay(DateTime.Seconds(15), function()
@@ -404,7 +404,7 @@ end
ChurchAttack = function()
if not ChurchDamaged then
local churchPanicTeam = Reinforcements.Reinforce(England, CivilianSquad1, { ChurchSpawn.Location }, 0)
local churchPanicTeam = Reinforcements.Reinforce(Greece, CivilianSquad1, { ChurchSpawn.Location }, 0)
Utils.Do(churchPanicTeam, function(a)
a.Move(a.Location + CVec.New(-1,-1))
a.Panic()
@@ -489,7 +489,7 @@ WorldLoaded = function()
Allies = Player.GetPlayer("Allies")
USSR = Player.GetPlayer("USSR")
BadGuy = Player.GetPlayer("BadGuy")
England = Player.GetPlayer("England")
Greece = Player.GetPlayer("Greece")
Civilians = Player.GetPlayer("GreekCivilians")
Trigger.OnObjectiveAdded(Allies, function(p, id)

View File

@@ -121,11 +121,7 @@ SendAlliedUnits = function()
if unit.Type == "e6" then
Engineer = unit
Trigger.OnKilled(unit, LandingPossible)
elseif unit.Type == "thf" then
Trigger.OnKilled(unit, function()
player.MarkFailedObjective(StealMoney)
end)
end
end
end)
end)
end)
@@ -301,7 +297,6 @@ InitObjectives = function()
end)
EliminateSuperTanks = player.AddPrimaryObjective("Eliminate these super tanks.")
StealMoney = player.AddPrimaryObjective("Steal money from the nearby outpost with the Thief.")
CrossRiver = player.AddPrimaryObjective("Secure transport to the mainland.")
FindOutpost = player.AddPrimaryObjective("Find our outpost and start repairs on it.")
RescueCivilians = player.AddSecondaryObjective("Evacuate all civilians from the hospital.")
@@ -382,17 +377,6 @@ InitTriggers = function()
end
end)
Trigger.OnInfiltrated(USSROutpostSilo, function()
MoneyStolen = true
player.MarkCompletedObjective(StealMoney)
end)
Trigger.OnKilledOrCaptured(USSROutpostSilo, function()
if not MoneyStolen then
player.MarkFailedObjective(StealMoney)
end
end)
beachReached = false
Trigger.OnEnteredFootprint(BeachTrigger, function(a, id)
if not beachReached and a.Owner == player then

View File

@@ -26,6 +26,9 @@ World:
Explodes:
Weapon: BarrelExplode
EmptyWeapon: BarrelExplode
-SpawnActorOnDeath@1:
-SpawnActorOnDeath@2:
-SpawnActorOnDeath@3:
V01.exploding:
Inherits: ^ExplodingCivBuilding

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Some files were not shown because too many files have changed in this diff Show More