Compare commits

..

24 Commits

Author SHA1 Message Date
Paul Chote
24459c29ae Merge branch 'gh-actions' into devtest-integration 2020-12-09 22:06:34 +00:00
Paul Chote
6347049e1c 18892 (pchote edition) 2020-12-09 22:06:30 +00:00
Paul Chote
45bc278647 Merge remote-tracking branch 'upstream/pr/18913' into devtest-integration 2020-12-09 22:05:58 +00:00
Paul Chote
7ab35bf127 Merge remote-tracking branch 'upstream/pr/18912' into devtest-integration 2020-12-09 22:05:51 +00:00
Paul Chote
01044f12d1 Merge remote-tracking branch 'upstream/pr/18894' into devtest-integration 2020-12-09 22:05:42 +00:00
Paul Chote
d0ec33758b Merge remote-tracking branch 'upstream/pr/18695' into devtest-integration 2020-12-09 22:05:32 +00:00
Paul Chote
7dec826591 Merge remote-tracking branch 'upstream/pr/18678' into devtest-integration 2020-12-09 22:05:24 +00:00
Paul Chote
c6eec76af9 Merge remote-tracking branch 'upstream/pr/18430' into devtest-integration 2020-12-09 22:05:17 +00:00
Paul Chote
2e1c1f1305 Merge remote-tracking branch 'upstream/pr/18874' into devtest-integration 2020-12-09 22:05:10 +00:00
Paul Chote
7abde1cc5f Merge remote-tracking branch 'upstream/pr/18902' into devtest-integration 2020-12-09 22:04:59 +00:00
Paul Chote
2f67fc64de Fix infantry move animations overriding attack animations in the same tick. 2020-12-09 21:56:17 +00:00
Paul Chote
880a584bd5 Revert "Fix WithInfantryBody wrongly overwriting attack animations"
This reverts commit 1a63cc4a41.
2020-12-09 21:53:39 +00:00
Paul Chote
756188b0d0 Prevent Civilians from wandering onto Tiberium. 2020-12-09 21:49:57 +00:00
Paul Chote
f1b0ef20c7 Add AvoidTerrainTypes to ScaredyCat. 2020-12-09 19:43:22 +00:00
Paul Chote
e014795c25 Add AvoidTerrainTypes to Wanders. 2020-12-09 19:42:14 +00:00
Paul Chote
baed329f21 Fix restart black screen race condition. 2020-12-06 21:42:42 +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
124 changed files with 780 additions and 3356 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

@@ -30,7 +30,7 @@ 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.")]
[Desc("The terrain types that this actor should avoid running on to while panicing.")]
public readonly HashSet<string> AvoidTerrainTypes = new HashSet<string>();
[SequenceReference(prefix: true)]

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,12 @@ namespace OpenRA.Mods.Common.Traits.Render
void INotifyAttack.PreparingAttack(Actor self, in Target target, Armament a, Barrel barrel)
{
// Lambdas can't use 'in' variables, so capture a copy for later
var attackTarget = target;
// 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));
self.World.AddFrameEndTask(_ => Attacking(self, attackTarget, a));
}
void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) { }

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

@@ -100,8 +100,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;
return null; // We'll be back the next tick; better to sit idle for a few seconds than prolong this tick indefinitely with a loop
}
if (info.AvoidTerrainTypes.Count > 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
@@ -500,7 +492,6 @@
Inherits@2: ^SpriteActor
Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -555,12 +546,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 +601,6 @@
^Plane:
Inherits@1: ^ExistsInWorld
Inherits@2: ^ClassicFacingSpriteActor
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -637,7 +626,6 @@
Inherits@1: ^ExistsInWorld
Inherits@3: ^SpriteActor
Inherits@selection: ^SelectableCombatUnit
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -665,7 +653,6 @@
Inherits@2: ^SpriteActor
Inherits@shape: ^1x1Shape
Inherits@selection: ^SelectableBuilding
Inherits@handicaps: ^PlayerHandicaps
Huntable:
OwnerLostAction:
Action: Kill
@@ -681,8 +668,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 +992,9 @@
Inherits@1: ^ClassicFacingSpriteActor
Interactable:
Health:
HP: 28000
HP: 14000
Armor:
Type: Heavy
Type: Light
HiddenUnderFog:
Type: CenterPosition
AlwaysVisibleRelationships: None
@@ -1042,14 +1029,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

@@ -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

View File

@@ -1,309 +0,0 @@
MapFormat: 11
RequiresMod: ra
Title: Oil Spill
Author: Super Newbie
Tileset: DESERT
MapSize: 120,120
Bounds: 1,1,118,118
Visibility: Lobby
Categories: Minigame
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: england
PlayerReference@Creeps:
Name: Creeps
NonCombatant: True
Faction: england
Enemies: Multi0, Multi1, Multi2, Multi3
PlayerReference@Multi0:
Name: Multi0
Playable: True
AllowBots: False
LockFaction: True
Faction: allies
Enemies: Creeps
PlayerReference@Multi1:
Name: Multi1
Playable: True
AllowBots: False
LockFaction: True
Faction: allies
Enemies: Creeps
PlayerReference@Multi2:
Name: Multi2
Playable: True
AllowBots: False
LockFaction: True
Faction: allies
Enemies: Creeps
PlayerReference@Multi3:
Name: Multi3
Playable: True
AllowBots: False
LockFaction: True
Faction: allies
Enemies: Creeps
Actors:
Actor1: rock1
Owner: Neutral
Location: 112,21
Actor2: tc01
Owner: Neutral
Location: 50,4
Actor3: tc01
Owner: Neutral
Location: 117,23
Actor4: tc01
Owner: Neutral
Location: 115,31
Actor5: tc01
Owner: Neutral
Location: 113,13
Actor6: tc01
Owner: Neutral
Location: 108,3
Actor7: v37
Owner: Neutral
Location: 66,3
Actor8: v30
Owner: Neutral
Location: 69,2
Actor9: v31
Owner: Neutral
Location: 48,3
Actor10: v24
Owner: Neutral
Location: 46,3
Actor12: v24
Owner: Neutral
Location: 117,102
Actor13: tc01
Owner: Neutral
Location: 94,116
Actor14: tc01
Owner: Neutral
Location: 102,111
Actor15: t08
Owner: Neutral
Location: 105,4
Actor18: rock6
Owner: Neutral
Location: 15,114
Actor19: rock7
Owner: Neutral
Location: 41,112
Actor20: rock6
Owner: Neutral
Location: 74,113
Actor21: tc01
Owner: Neutral
Location: 31,113
Actor22: tc01
Owner: Neutral
Location: 62,113
Actor23: t08
Owner: Neutral
Location: 74,112
Actor24: v25
Owner: Neutral
Location: 116,99
Actor26: tc01
Owner: Neutral
Location: 3,30
Actor25: tc01
Owner: Neutral
Location: 4,36
Actor27: rock2
Owner: Neutral
Location: 5,81
Actor28: v21
Owner: Neutral
Location: 3,88
Actor29: v30
Owner: Neutral
Location: 2,91
Actor30: t08
Owner: Neutral
Location: 5,41
Actor31: tc01
Owner: Neutral
Location: 72,34
Actor32: t08
Owner: Neutral
Location: 71,34
Actor33: tc01
Owner: Neutral
Location: 82,44
Actor36: oilb
Owner: Neutral
Location: 51,51
Actor37: oilb
Owner: Neutral
Location: 67,51
Actor38: oilb
Owner: Neutral
Location: 51,67
Actor39: oilb
Owner: Neutral
Location: 67,67
Actor44: oilb
Owner: Neutral
Location: 46,82
Actor45: oilb
Owner: Neutral
Location: 36,72
Actor46: oilb
Owner: Neutral
Location: 72,82
Actor47: oilb
Owner: Neutral
Location: 36,46
Actor48: oilb
Owner: Neutral
Location: 46,36
Actor49: oilb
Owner: Neutral
Location: 82,46
Actor50: oilb
Owner: Neutral
Location: 72,36
Actor53: oilb
Owner: Neutral
Location: 59,34
Actor54: oilb
Owner: Neutral
Location: 34,59
Actor55: oilb
Owner: Neutral
Location: 59,84
Actor56: oilb
Owner: Neutral
Location: 84,59
OilBottomLeft2: oilb
Location: 18,96
Owner: Neutral
OilBottomLeft1: oilb
Location: 22,100
Owner: Neutral
OilBottomRight2: oilb
Owner: Neutral
Location: 96,100
OilBottomRight1: oilb
Owner: Neutral
Location: 100,96
OilTopLeft2: oilb
Owner: Neutral
Location: 22,18
OilTopLeft1: oilb
Owner: Neutral
Location: 18,22
OilTopRight2: oilb
Location: 100,22
Owner: Neutral
OilTopRight1: oilb
Location: 96,18
Owner: Neutral
Actor65: fcom
Owner: Neutral
Location: 48,96
Actor69: fcom
Owner: Neutral
Location: 70,96
Actor70: fcom
Owner: Neutral
Location: 22,70
Actor72: fcom
Owner: Neutral
Location: 22,48
Actor73: fcom
Owner: Neutral
Location: 48,22
Actor71: fcom
Owner: Neutral
Location: 70,22
Actor74: fcom
Owner: Neutral
Location: 96,48
Actor75: fcom
Owner: Neutral
Location: 96,70
Actor77: oilb
Owner: Neutral
Location: 82,72
Actor80: oilb
Owner: Neutral
Location: 46,20
Actor81: oilb
Owner: Neutral
Location: 72,20
Actor82: oilb
Owner: Neutral
Location: 46,98
Actor83: oilb
Owner: Neutral
Location: 72,98
Actor84: oilb
Owner: Neutral
Location: 20,72
Actor85: oilb
Owner: Neutral
Location: 20,46
Actor86: oilb
Owner: Neutral
Location: 98,46
Actor87: oilb
Owner: Neutral
Location: 98,72
OilTopLeft3: oilb
Owner: Neutral
Location: 29,29
OilBottomLeft3: oilb
Location: 29,89
Owner: Neutral
OilTopRight3: oilb
Location: 89,29
Owner: Neutral
OilBottomRight3: oilb
Owner: Neutral
Location: 89,89
Spawn0: mpspawn
Owner: Neutral
Location: 31,31
Spawn1: mpspawn
Owner: Neutral
Location: 87,31
Spawn2: mpspawn
Owner: Neutral
Location: 31,87
Spawn3: mpspawn
Owner: Neutral
Location: 87,87
FCOMTopLeft: fcom
Owner: Neutral
Location: 31,31
FCOMTopRight: fcom
Owner: Neutral
Location: 87,31
FCOMBottomLeft: fcom
Owner: Neutral
Location: 31,87
FCOMBottomRight: fcom
Owner: Neutral
Location: 87,87
Rules: rules.yaml
Sequences: sequences.yaml

View File

@@ -1,27 +0,0 @@
--[[
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.
]]
SpawnBuildings =
{
{ FCOMTopLeft, OilTopLeft1, OilTopLeft2, OilTopLeft3 },
{ FCOMTopRight, OilTopRight1, OilTopRight2, OilTopRight3 },
{ FCOMBottomLeft, OilBottomLeft1, OilBottomLeft2, OilBottomLeft3 },
{ FCOMBottomRight, OilBottomRight1, OilBottomRight2, OilBottomRight3 },
}
WorldLoaded = function()
for i = 0, 4 do
local player = Player.GetPlayer("Multi" .. i)
if player then
Utils.Do(SpawnBuildings[player.Spawn], function(actor)
actor.Owner = player
end)
end
end
end

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