Compare commits
84 Commits
devtest-20
...
devtest-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b278a63e11 | ||
|
|
7ba140e471 | ||
|
|
df476dd96f | ||
|
|
f813f2bd46 | ||
|
|
c9c24490e6 | ||
|
|
11d84041d9 | ||
|
|
7ec9bdf0d0 | ||
|
|
ef59b07a2d | ||
|
|
74e3ded764 | ||
|
|
a46fab4ece | ||
|
|
81a7c3446d | ||
|
|
a3404fac66 | ||
|
|
bb2276498b | ||
|
|
7367b546e8 | ||
|
|
becc180956 | ||
|
|
656ce35330 | ||
|
|
2575b41492 | ||
|
|
acaf535b67 | ||
|
|
503a434a4b | ||
|
|
e27c093536 | ||
|
|
fed7daa03d | ||
|
|
3906c6efab | ||
|
|
ae018235d0 | ||
|
|
a8f6256c04 | ||
|
|
de6a9dc8da | ||
|
|
f14e3669e3 | ||
|
|
21eb585a28 | ||
|
|
f8dddf0502 | ||
|
|
d3482c0f18 | ||
|
|
d1c9b8d30f | ||
|
|
d2a6b7370e | ||
|
|
20b55ab5db | ||
|
|
c7ffc4d24f | ||
|
|
2ce83bb51f | ||
|
|
ea9f967acd | ||
|
|
4a6927b513 | ||
|
|
cab611b8dd | ||
|
|
47bfa8bce8 | ||
|
|
40c452b07e | ||
|
|
f1b238d7bf | ||
|
|
0028a26193 | ||
|
|
bcdbd02f1c | ||
|
|
805fc5cade | ||
|
|
90ddbbc934 | ||
|
|
5f9126f274 | ||
|
|
a1011efd98 | ||
|
|
135ee781d4 | ||
|
|
56ef43145b | ||
|
|
ff1bfe162b | ||
|
|
c642162d55 | ||
|
|
4bec1d1950 | ||
|
|
e769f51169 | ||
|
|
ee19990749 | ||
|
|
0eefb0bc8c | ||
|
|
dd10b52955 | ||
|
|
9a8b5da727 | ||
|
|
53fe004c01 | ||
|
|
eea0ca1a4e | ||
|
|
ccbc78ea98 | ||
|
|
befcbe3677 | ||
|
|
1f48359899 | ||
|
|
c4aed8af3f | ||
|
|
2d30913f06 | ||
|
|
e3c96cf283 | ||
|
|
325f414d45 | ||
|
|
4371fb058b | ||
|
|
1d3461f5da | ||
|
|
271f2ce539 | ||
|
|
8c29a44795 | ||
|
|
226b96f9b0 | ||
|
|
fa75891f62 | ||
|
|
9c4dd4a08a | ||
|
|
a75de2dd8b | ||
|
|
5249841ab7 | ||
|
|
01204eb414 | ||
|
|
58e86d1499 | ||
|
|
3b3c6a6647 | ||
|
|
31c6e3826e | ||
|
|
14f5c9d228 | ||
|
|
97d165ed94 | ||
|
|
d6c9bedd5a | ||
|
|
00bc08e9a8 | ||
|
|
924cf4a885 | ||
|
|
1f7eef8ffc |
1
.github/workflows/ci.yaml
vendored
1
.github/workflows/ci.yaml
vendored
@@ -37,6 +37,7 @@ 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"
|
||||
|
||||
|
||||
24
.github/workflows/documentation.yml
vendored
24
.github/workflows/documentation.yml
vendored
@@ -60,31 +60,39 @@ jobs:
|
||||
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.git
|
||||
repository: openra/docs
|
||||
token: ${{ secrets.DOCS_TOKEN }}
|
||||
path: docs
|
||||
ref: ${{ github.event.inputs.tag }}
|
||||
|
||||
- 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/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"
|
||||
./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/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"
|
||||
./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:
|
||||
|
||||
22
.github/workflows/itch.yml
vendored
22
.github/workflows/itch.yml
vendored
@@ -15,17 +15,15 @@ jobs:
|
||||
if: github.repository == 'openra/openra'
|
||||
steps:
|
||||
- name: Download Packages
|
||||
env:
|
||||
GIT_TAG: ${{ github.event.inputs.tag }}
|
||||
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
|
||||
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
|
||||
@@ -35,7 +33,7 @@ jobs:
|
||||
ITCH_GAME: openra
|
||||
ITCH_USER: openra-developers
|
||||
VERSION: ${{ github.event.inputs.tag }}
|
||||
PACKAGE: OpenRA-${{ github.event.inputs.tag }}}-x64.exe"
|
||||
PACKAGE: OpenRA-${{ github.event.inputs.tag }}}-x64.exe
|
||||
|
||||
- name: Publish Windows Itch Bundle
|
||||
uses: josephbmanley/butler-publish-itchio-action@master
|
||||
@@ -55,7 +53,7 @@ jobs:
|
||||
ITCH_GAME: openra
|
||||
ITCH_USER: openra-developers
|
||||
VERSION: ${{ github.event.inputs.tag }}
|
||||
PACKAGE: OpenRA-${{ github.event.inputs.tag }}}.dmg"
|
||||
PACKAGE: OpenRA-${{ github.event.inputs.tag }}}.dmg
|
||||
|
||||
- name: Publish RA AppImage
|
||||
uses: josephbmanley/butler-publish-itchio-action@master
|
||||
|
||||
27
.github/workflows/packaging.yml
vendored
27
.github/workflows/packaging.yml
vendored
@@ -8,6 +8,30 @@ 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
|
||||
@@ -72,7 +96,8 @@ jobs:
|
||||
- name: Prepare Environment
|
||||
run: |
|
||||
echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV}
|
||||
sudo apt install nsis
|
||||
sudo apt-get update
|
||||
sudo apt-get install nsis
|
||||
|
||||
- name: Package Installers
|
||||
run: |
|
||||
|
||||
20
.vscode/launch.json
vendored
20
.vscode/launch.json
vendored
@@ -11,9 +11,8 @@
|
||||
"type": "mono"
|
||||
},
|
||||
"request": "launch",
|
||||
"program": "${workspaceRoot}/OpenRA.Game.exe",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"args": ["Game.Mod=cnc"],
|
||||
"program": "${workspaceRoot}/bin/OpenRA.exe",
|
||||
"args": ["Game.Mod=cnc", "Engine.EngineDir=.."],
|
||||
"preLaunchTask": "build",
|
||||
},
|
||||
{
|
||||
@@ -26,9 +25,8 @@
|
||||
"type": "mono"
|
||||
},
|
||||
"request": "launch",
|
||||
"program": "${workspaceRoot}/OpenRA.Game.exe",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"args": ["Game.Mod=ra"],
|
||||
"program": "${workspaceRoot}/bin/OpenRA.exe",
|
||||
"args": ["Game.Mod=ra", "Engine.EngineDir=.."],
|
||||
"preLaunchTask": "build",
|
||||
},
|
||||
{
|
||||
@@ -41,9 +39,8 @@
|
||||
"type": "mono"
|
||||
},
|
||||
"request": "launch",
|
||||
"program": "${workspaceRoot}/OpenRA.Game.exe",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"args": ["Game.Mod=d2k"],
|
||||
"program": "${workspaceRoot}/bin/OpenRA.exe",
|
||||
"args": ["Game.Mod=d2k", "Engine.EngineDir=.."],
|
||||
"preLaunchTask": "build",
|
||||
},
|
||||
{
|
||||
@@ -56,9 +53,8 @@
|
||||
"type": "mono"
|
||||
},
|
||||
"request": "launch",
|
||||
"program": "${workspaceRoot}/OpenRA.Game.exe",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"args": ["Game.Mod=ts"],
|
||||
"program": "${workspaceRoot}/bin/OpenRA.exe",
|
||||
"args": ["Game.Mod=ts", "Engine.EngineDir=.."],
|
||||
"preLaunchTask": "build",
|
||||
},
|
||||
]
|
||||
|
||||
37
Makefile
37
Makefile
@@ -15,6 +15,10 @@
|
||||
# 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
|
||||
#
|
||||
@@ -48,10 +52,6 @@ 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,7 +61,8 @@ RM_R = $(RM) -r
|
||||
RM_F = $(RM) -f
|
||||
RM_RF = $(RM) -rf
|
||||
|
||||
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
|
||||
# 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))
|
||||
|
||||
# Detect target platform for dependencies if not given by the user
|
||||
ifndef TARGETPLATFORM
|
||||
@@ -98,7 +99,10 @@ clean:
|
||||
check:
|
||||
@echo
|
||||
@echo "Compiling in debug mode..."
|
||||
@$(MSBUILD) -t:build -restore -p:Configuration=Debug
|
||||
@$(MSBUILD) -t:build -restore -p:Configuration=Debug -p:TargetPlatform=$(TARGETPLATFORM)
|
||||
ifeq ($(TARGETPLATFORM), unix-generic)
|
||||
@./configure-system-libraries.sh
|
||||
endif
|
||||
@echo
|
||||
@echo "Checking runtime assemblies..."
|
||||
@$(OPENRA_UTILITY) all --check-runtime-assemblies $(WHITELISTED_OPENRA_ASSEMBLIES) $(WHITELISTED_THIRDPARTY_ASSEMBLIES) $(WHITELISTED_CORE_ASSEMBLIES)
|
||||
@@ -133,18 +137,21 @@ 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
|
||||
@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'
|
||||
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'
|
||||
|
||||
install:
|
||||
@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'
|
||||
@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'
|
||||
|
||||
install-linux-shortcuts:
|
||||
@sh -c '. ./packaging/functions.sh; install_linux_shortcuts $(CWD) $(OPENRA_INSTALL_DIR) $(BIN_INSTALL_DIR) $(DATA_INSTALL_DIR) $(VERSION) cnc d2k ra'
|
||||
@sh -c '. ./packaging/functions.sh; install_linux_shortcuts $(CWD) "$(DESTDIR)" "$(gameinstalldir)" "$(bindir)" "$(datadir)" "$(shell head -n1 VERSION)" cnc d2k ra'
|
||||
|
||||
install-linux-appdata:
|
||||
@sh -c '. ./packaging/functions.sh; install_linux_appdata $(CWD) $(DATA_INSTALL_DIR) cnc d2k ra'
|
||||
@sh -c '. ./packaging/functions.sh; install_linux_appdata $(CWD) "$(DESTDIR)" "$(datadir)" cnc d2k ra'
|
||||
|
||||
help:
|
||||
@echo 'to compile, run:'
|
||||
@@ -160,7 +167,11 @@ help:
|
||||
@echo ' make test'
|
||||
@echo
|
||||
@echo 'to compile and install Red Alert, Tiberian Dawn, and Dune 2000 run:'
|
||||
@echo ' make [prefix=/foo] install'
|
||||
@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
|
||||
@echo 'to install Linux startup scripts, desktop files, icons, and MIME metadata'
|
||||
@echo ' make install-linux-shortcuts'
|
||||
|
||||
@@ -123,6 +123,7 @@ 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,
|
||||
@@ -166,6 +167,7 @@ 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;
|
||||
|
||||
@@ -166,6 +166,7 @@ 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);
|
||||
|
||||
@@ -50,6 +50,9 @@ namespace OpenRA
|
||||
public bool LockTeam = false;
|
||||
public int Team = 0;
|
||||
|
||||
public bool LockHandicap = false;
|
||||
public int Handicap = 0;
|
||||
|
||||
public string[] Allies = { };
|
||||
public string[] Enemies = { };
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ 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;
|
||||
@@ -39,6 +40,7 @@ namespace OpenRA.Network
|
||||
Faction = client.Faction;
|
||||
SpawnPoint = client.SpawnPoint;
|
||||
Team = client.Team;
|
||||
Handicap = client.Handicap;
|
||||
Slot = client.Slot;
|
||||
Bot = client.Bot;
|
||||
IsAdmin = client.IsAdmin;
|
||||
@@ -53,6 +55,7 @@ namespace OpenRA.Network
|
||||
client.Faction = Faction;
|
||||
client.SpawnPoint = SpawnPoint;
|
||||
client.Team = Team;
|
||||
client.Handicap = Handicap;
|
||||
client.Slot = Slot;
|
||||
client.Bot = Bot;
|
||||
client.IsAdmin = IsAdmin;
|
||||
|
||||
@@ -144,6 +144,7 @@ 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
|
||||
@@ -193,6 +194,7 @@ namespace OpenRA.Network
|
||||
public bool LockFaction;
|
||||
public bool LockColor;
|
||||
public bool LockTeam;
|
||||
public bool LockHandicap;
|
||||
public bool LockSpawn;
|
||||
public bool Required;
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ 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;
|
||||
@@ -180,6 +181,8 @@ namespace OpenRA
|
||||
HomeLocation = assignSpawnPoints?.AssignHomeLocation(world, client, playerRandom) ?? pr.HomeLocation;
|
||||
SpawnPoint = assignSpawnPoints?.SpawnPointForPlayer(this) ?? client.SpawnPoint;
|
||||
DisplaySpawnPoint = client.SpawnPoint;
|
||||
|
||||
Handicap = client.Handicap;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -195,6 +198,7 @@ namespace OpenRA
|
||||
DisplayFaction = ResolveDisplayFaction(world, pr.Faction);
|
||||
HomeLocation = pr.HomeLocation;
|
||||
SpawnPoint = DisplaySpawnPoint = 0;
|
||||
Handicap = pr.Handicap;
|
||||
}
|
||||
|
||||
if (!spectating)
|
||||
|
||||
@@ -93,6 +93,8 @@ 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;
|
||||
}
|
||||
@@ -437,6 +439,7 @@ namespace OpenRA.Server
|
||||
Faction = "Random",
|
||||
SpawnPoint = 0,
|
||||
Team = 0,
|
||||
Handicap = 0,
|
||||
State = Session.ClientState.Invalid,
|
||||
};
|
||||
|
||||
|
||||
@@ -256,6 +256,8 @@ namespace OpenRA
|
||||
public int IntroductionPromptVersion = 0;
|
||||
|
||||
public MPGameFilters MPGameFilters = MPGameFilters.Waiting | MPGameFilters.Empty | MPGameFilters.Protected | MPGameFilters.Started;
|
||||
|
||||
public bool PauseShellmap = false;
|
||||
}
|
||||
|
||||
public class Settings
|
||||
|
||||
@@ -32,6 +32,7 @@ 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>>();
|
||||
|
||||
@@ -226,6 +227,7 @@ namespace OpenRA
|
||||
};
|
||||
|
||||
RulesContainTemporaryBlocker = map.Rules.Actors.Any(a => a.Value.HasTraitInfo<ITemporaryBlockerInfo>());
|
||||
gameSettings = Game.Settings.Game;
|
||||
}
|
||||
|
||||
public void AddToMaps(Actor self, IOccupySpace ios)
|
||||
@@ -424,7 +426,9 @@ namespace OpenRA
|
||||
wasLoadingGameSave = false;
|
||||
}
|
||||
|
||||
if (!Paused)
|
||||
// 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))
|
||||
{
|
||||
WorldTick++;
|
||||
|
||||
|
||||
@@ -82,6 +82,9 @@ 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;
|
||||
@@ -103,6 +106,9 @@ 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));
|
||||
|
||||
@@ -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.ContainsKey(order))
|
||||
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
|
||||
world.CancelInputMode();
|
||||
}
|
||||
|
||||
|
||||
@@ -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.ContainsKey(order))
|
||||
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
|
||||
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.ContainsKey(order))
|
||||
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
|
||||
world.CancelInputMode();
|
||||
}
|
||||
|
||||
|
||||
@@ -142,6 +142,13 @@ 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;
|
||||
|
||||
@@ -72,8 +72,7 @@ namespace OpenRA.Mods.Common.Effects
|
||||
return;
|
||||
|
||||
var exit = building.NearestExitOrDefault(targetLineNodes[0]);
|
||||
var exitPos = exit != null ? building.World.Map.CenterOfCell(building.Location + exit.Info.ExitCell) : building.CenterPosition;
|
||||
targetLineNodes.Insert(0, exitPos);
|
||||
targetLineNodes.Insert(0, building.CenterPosition + (exit?.Info.SpawnOffset ?? WVec.Zero));
|
||||
}
|
||||
|
||||
IEnumerable<IRenderable> IEffect.Render(WorldRenderer wr) { return SpriteRenderable.None; }
|
||||
|
||||
@@ -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)
|
||||
if (currentChunkBuffer == chunkBufferParts && chunkBufferParts != 0)
|
||||
{
|
||||
if (!cbpIsCompressed)
|
||||
cbf = (byte[])cbp.Clone();
|
||||
|
||||
@@ -21,12 +21,14 @@ 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)
|
||||
@@ -109,6 +111,9 @@ 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)
|
||||
{
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using Eluant;
|
||||
using OpenRA.Primitives;
|
||||
using OpenRA.Scripting;
|
||||
using OpenRA.Traits;
|
||||
|
||||
@@ -34,10 +36,18 @@ namespace OpenRA.Mods.Common.Scripting
|
||||
[Desc("Maximum health of the actor.")]
|
||||
public int MaxHealth { get { return health.MaxHP; } }
|
||||
|
||||
[Desc("Kill the actor.")]
|
||||
public void Kill()
|
||||
[Desc("Kill the actor. damageTypes may be omitted, specified as a string, or as table of strings.")]
|
||||
public void Kill(object damageTypes = null)
|
||||
{
|
||||
health.InflictDamage(Self, Self, new Damage(health.MaxHP), true);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,16 @@ 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; } }
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ namespace OpenRA.Mods.Common.Server
|
||||
{ "name", Name },
|
||||
{ "faction", Faction },
|
||||
{ "team", Team },
|
||||
{ "handicap", Handicap },
|
||||
{ "spawn", Spawn },
|
||||
{ "clear_spawn", ClearPlayerSpawn },
|
||||
{ "color", PlayerColor },
|
||||
@@ -245,6 +246,7 @@ 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);
|
||||
@@ -377,6 +379,7 @@ namespace OpenRA.Mods.Common.Server
|
||||
Faction = "Random",
|
||||
SpawnPoint = 0,
|
||||
Team = 0,
|
||||
Handicap = 0,
|
||||
State = Session.ClientState.NotReady,
|
||||
BotControllerClientIndex = controllerClientIndex
|
||||
};
|
||||
@@ -736,6 +739,7 @@ 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));
|
||||
@@ -824,6 +828,42 @@ 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);
|
||||
@@ -1003,6 +1043,7 @@ namespace OpenRA.Mods.Common.Server
|
||||
LockFaction = pr.LockFaction,
|
||||
LockColor = pr.LockColor,
|
||||
LockTeam = pr.LockTeam,
|
||||
LockHandicap = pr.LockHandicap,
|
||||
LockSpawn = pr.LockSpawn,
|
||||
Required = pr.Required,
|
||||
};
|
||||
|
||||
@@ -22,9 +22,6 @@ 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);
|
||||
|
||||
|
||||
@@ -348,8 +348,11 @@ namespace OpenRA.Mods.Common.Traits
|
||||
return chosenTarget;
|
||||
|
||||
var targetsInRange = self.World.FindActorsInCircle(self.CenterPosition, scanRange)
|
||||
.Select(Target.FromActor)
|
||||
.Concat(self.Owner.FrozenActorLayer.FrozenActorsInCircle(self.World, 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.FromFrozenActor));
|
||||
|
||||
foreach (var target in targetsInRange)
|
||||
|
||||
@@ -53,8 +53,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
|
||||
|
||||
if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits))
|
||||
{
|
||||
foreach (var u in owner.Units)
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", u, Target.FromCell(owner.World, owner.TargetActor.Location), false));
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
|
||||
|
||||
// We have gathered sufficient units. Attack the nearest enemy unit.
|
||||
owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackMoveState(), true);
|
||||
@@ -124,8 +123,9 @@ 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));
|
||||
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));
|
||||
|
||||
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));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -138,8 +138,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
|
||||
owner.FuzzyStateMachine.ChangeState(owner, new GroundUnitsAttackState(), true);
|
||||
}
|
||||
else
|
||||
foreach (var a in owner.Units)
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false));
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
|
||||
}
|
||||
|
||||
if (ShouldFlee(owner))
|
||||
|
||||
@@ -78,8 +78,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
|
||||
|
||||
if (AttackOrFleeFuzzy.Default.CanAttack(owner.Units, enemyUnits))
|
||||
{
|
||||
foreach (var u in owner.Units)
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", u, Target.FromCell(owner.World, owner.TargetActor.Location), false));
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
|
||||
|
||||
// We have gathered sufficient units. Attack the nearest enemy unit.
|
||||
owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackMoveState(), true);
|
||||
@@ -149,8 +148,9 @@ 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));
|
||||
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));
|
||||
|
||||
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));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -163,8 +163,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
|
||||
owner.FuzzyStateMachine.ChangeState(owner, new NavyUnitsAttackState(), true);
|
||||
}
|
||||
else
|
||||
foreach (var a in owner.Units)
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false));
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
|
||||
}
|
||||
|
||||
if (ShouldFlee(owner))
|
||||
|
||||
@@ -55,10 +55,7 @@ namespace OpenRA.Mods.Common.Traits.BotModules.Squads
|
||||
Backoff--;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var a in owner.Units)
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", a, Target.FromCell(owner.World, owner.TargetActor.Location), false));
|
||||
}
|
||||
owner.Bot.QueueOrder(new Order("AttackMove", null, Target.FromCell(owner.World, owner.TargetActor.Location), false, groupedActors: owner.Units.ToArray()));
|
||||
}
|
||||
|
||||
public void Deactivate(Squad owner) { }
|
||||
|
||||
@@ -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)
|
||||
.OrderBy(e => e.Info.Priority)
|
||||
.OrderByDescending(e => e.Info.Priority)
|
||||
.ThenBy(e => (actor.World.Map.CenterOfCell(actor.Location + e.Info.ExitCell) - pos).LengthSquared)
|
||||
.ToList();
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#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 { }
|
||||
}
|
||||
@@ -412,8 +412,11 @@ namespace OpenRA.Mods.Common.Traits
|
||||
var hasPlayedSound = false;
|
||||
BeginProduction(new ProductionItem(this, order.TargetString, cost, playerPower, () => self.World.AddFrameEndTask(_ =>
|
||||
{
|
||||
var isBuilding = unit.HasTraitInfo<BuildingInfo>();
|
||||
// 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)
|
||||
|
||||
@@ -106,6 +106,8 @@ namespace OpenRA.Mods.Common.Traits
|
||||
return ret;
|
||||
}
|
||||
|
||||
public Player Owner { get { return player; } }
|
||||
|
||||
class Watcher
|
||||
{
|
||||
public readonly string Key;
|
||||
|
||||
@@ -29,8 +29,10 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
public readonly string DefaultAttackSequence = null;
|
||||
|
||||
[SequenceReference(dictionaryReference: LintDictionaryReference.Values)]
|
||||
[Desc("Attack sequence to use for each armament.")]
|
||||
public readonly Dictionary<string, string> AttackSequences = new Dictionary<string, string>();
|
||||
[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[]>();
|
||||
|
||||
[SequenceReference]
|
||||
public readonly string[] IdleSequences = { };
|
||||
@@ -133,11 +135,21 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
}
|
||||
}
|
||||
|
||||
public void Attacking(Actor self, in Target target, Armament a)
|
||||
void Attacking(Actor self, Armament a, Barrel barrel)
|
||||
{
|
||||
var info = GetDisplayInfo();
|
||||
if (!info.AttackSequences.TryGetValue(a.Info.Name, out var sequence))
|
||||
sequence = info.DefaultAttackSequence;
|
||||
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 (!string.IsNullOrEmpty(sequence) && DefaultAnimation.HasSequence(NormalizeInfantrySequence(self, sequence)))
|
||||
{
|
||||
@@ -148,12 +160,9 @@ 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, attackTarget, a));
|
||||
self.World.AddFrameEndTask(_ => Attacking(self, a, barrel));
|
||||
}
|
||||
|
||||
void INotifyAttack.Attacking(Actor self, in Target target, Armament a, Barrel barrel) { }
|
||||
|
||||
@@ -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.ContainsKey(order))
|
||||
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
|
||||
world.CancelInputMode();
|
||||
}
|
||||
|
||||
|
||||
@@ -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.ContainsKey(order))
|
||||
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
|
||||
world.CancelInputMode();
|
||||
}
|
||||
|
||||
|
||||
@@ -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.ContainsKey(order))
|
||||
if (!manager.Powers.TryGetValue(order, out var p) || !p.Active || !p.Ready)
|
||||
world.CancelInputMode();
|
||||
}
|
||||
|
||||
|
||||
@@ -64,6 +64,7 @@ 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,
|
||||
|
||||
@@ -214,6 +214,10 @@ 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;
|
||||
|
||||
@@ -218,6 +218,9 @@ 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";
|
||||
|
||||
|
||||
@@ -268,11 +268,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
case "delete":
|
||||
{
|
||||
var sourcePath = Path.Combine(path, i.Value.Value);
|
||||
|
||||
// Try as an absolute path
|
||||
if (!File.Exists(sourcePath))
|
||||
sourcePath = Platform.ResolvePath(i.Value.Value);
|
||||
// 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);
|
||||
|
||||
Log.Write("debug", "Deleting {0}", sourcePath);
|
||||
File.Delete(sourcePath);
|
||||
@@ -325,11 +322,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
static void ExtractFromPackage(ExtractionType type, string path, MiniYaml actionYaml, List<string> extractedFiles, Action<string> updateMessage)
|
||||
{
|
||||
var sourcePath = Path.Combine(path, actionYaml.Value);
|
||||
|
||||
// Try as an absolute path
|
||||
if (!File.Exists(sourcePath))
|
||||
sourcePath = Platform.ResolvePath(actionYaml.Value);
|
||||
// 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);
|
||||
|
||||
using (var source = File.OpenRead(sourcePath))
|
||||
{
|
||||
@@ -384,11 +378,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
static void ExtractFromMSCab(string path, MiniYaml actionYaml, List<string> extractedFiles, Action<string> updateMessage)
|
||||
{
|
||||
var sourcePath = Path.Combine(path, actionYaml.Value);
|
||||
|
||||
// Try as an absolute path
|
||||
if (!File.Exists(sourcePath))
|
||||
sourcePath = Platform.ResolvePath(actionYaml.Value);
|
||||
// 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);
|
||||
|
||||
using (var source = File.OpenRead(sourcePath))
|
||||
{
|
||||
@@ -418,11 +409,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
static void ExtractFromISCab(string path, MiniYaml actionYaml, List<string> extractedFiles, Action<string> updateMessage)
|
||||
{
|
||||
var sourcePath = Path.Combine(path, actionYaml.Value);
|
||||
|
||||
// Try as an absolute path
|
||||
if (!File.Exists(sourcePath))
|
||||
sourcePath = Platform.ResolvePath(actionYaml.Value);
|
||||
// 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 volumeNode = actionYaml.Nodes.FirstOrDefault(n => n.Key == "Volumes");
|
||||
if (volumeNode == null)
|
||||
|
||||
@@ -624,6 +624,7 @@ 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);
|
||||
}
|
||||
@@ -640,6 +641,7 @@ 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);
|
||||
@@ -648,6 +650,7 @@ 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);
|
||||
}
|
||||
|
||||
@@ -752,7 +755,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
void UpdateDiscordStatus()
|
||||
{
|
||||
var mapTitle = map.Title;
|
||||
var numberOfPlayers = 0;
|
||||
var slots = 0;
|
||||
|
||||
@@ -771,6 +773,11 @@ 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;
|
||||
@@ -781,8 +788,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
|
||||
@@ -790,7 +797,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
if (!skirmishMode)
|
||||
DiscordService.UpdatePlayers(numberOfPlayers, slots);
|
||||
|
||||
DiscordService.UpdateDetails(mapTitle);
|
||||
DiscordService.UpdateDetails(details);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -806,7 +813,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
Ui.CloseWindow();
|
||||
|
||||
var state = skirmishMode ? DiscordState.PlayingSkirmish : DiscordState.PlayingMultiplayer;
|
||||
DiscordService.UpdateStatus(state);
|
||||
var details = map.Title + " - " + orderManager.LobbyInfo.GlobalSettings.ServerName;
|
||||
DiscordService.UpdateStatus(state, details);
|
||||
|
||||
onStart();
|
||||
}
|
||||
|
||||
@@ -146,6 +146,25 @@ 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)
|
||||
{
|
||||
@@ -562,6 +581,29 @@ 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");
|
||||
|
||||
@@ -43,7 +43,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
this.modData = modData;
|
||||
this.onSelect = onSelect;
|
||||
|
||||
var approving = new Action(() => { Ui.CloseWindow(); onSelect(selectedUid); });
|
||||
var approving = new Action(() =>
|
||||
{
|
||||
Ui.CloseWindow();
|
||||
onSelect?.Invoke(selectedUid);
|
||||
});
|
||||
|
||||
var canceling = new Action(() => { Ui.CloseWindow(); onExit(); });
|
||||
|
||||
var okButton = widget.Get<ButtonWidget>("BUTTON_OK");
|
||||
|
||||
@@ -334,14 +334,24 @@ 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);
|
||||
|
||||
games = yaml.Select(a => new GameServer(a.Value))
|
||||
.Where(gs => gs.Address != null)
|
||||
.ToList();
|
||||
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.
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -246,6 +246,8 @@ 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)
|
||||
|
||||
@@ -86,7 +86,8 @@ namespace OpenRA.Mods.D2k.Traits.Buildings
|
||||
// Fill the footprint with random variants
|
||||
foreach (var c in info.Tiles(self.Location))
|
||||
{
|
||||
if (!map.Contains(c) || map.CustomTerrain[c] != byte.MaxValue)
|
||||
// Only place on allowed terrain types
|
||||
if (!map.Contains(c) || map.CustomTerrain[c] != byte.MaxValue || !info.TerrainTypes.Contains(map.GetTerrainInfo(c).Type))
|
||||
continue;
|
||||
|
||||
// Don't place under other buildings (or their bib)
|
||||
@@ -102,7 +103,9 @@ 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);
|
||||
if (!map.Contains(c) || map.CustomTerrain[c] != byte.MaxValue)
|
||||
|
||||
// Only place on allowed terrain types
|
||||
if (!map.Contains(c) || map.CustomTerrain[c] != byte.MaxValue || !info.TerrainTypes.Contains(map.GetTerrainInfo(c).Type))
|
||||
continue;
|
||||
|
||||
// Don't place under other buildings (or their bib)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
</AssemblyAttribute>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="OpenRA-SDL2-CS" Version="1.0.27" />
|
||||
<PackageReference Include="OpenRA-SDL2-CS" Version="1.0.28" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj" />
|
||||
|
||||
50
make.ps1
50
make.ps1
@@ -24,7 +24,8 @@ function All-Command
|
||||
{
|
||||
echo "Downloading IP2Location GeoIP database."
|
||||
$target = Join-Path $pwd.ToString() "IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP"
|
||||
(New-Object System.Net.WebClient).DownloadFile("https://download.ip2location.com/lite/IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP", $target)
|
||||
[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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,9 +37,8 @@ function Clean-Command
|
||||
}
|
||||
|
||||
dotnet clean /nologo
|
||||
rm ./bin -r
|
||||
rm ./*/bin -r
|
||||
rm ./*/obj -r
|
||||
Remove-Item ./bin -Recurse -ErrorAction Ignore
|
||||
Remove-Item ./*/obj -Recurse -ErrorAction Ignore
|
||||
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
|
||||
Invoke-Expression "$utilityPath ts --check-yaml"
|
||||
InvokeCommand "$utilityPath ts --check-yaml"
|
||||
Write-Host "Testing Dune 2000 mod MiniYAML..." -ForegroundColor Cyan
|
||||
Invoke-Expression "$utilityPath d2k --check-yaml"
|
||||
InvokeCommand "$utilityPath d2k --check-yaml"
|
||||
Write-Host "Testing Tiberian Dawn mod MiniYAML..." -ForegroundColor Cyan
|
||||
Invoke-Expression "$utilityPath cnc --check-yaml"
|
||||
InvokeCommand "$utilityPath cnc --check-yaml"
|
||||
Write-Host "Testing Red Alert mod MiniYAML..." -ForegroundColor Cyan
|
||||
Invoke-Expression "$utilityPath ra --check-yaml"
|
||||
InvokeCommand "$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
|
||||
Invoke-Expression "$utilityPath all --check-explicit-interfaces"
|
||||
InvokeCommand "$utilityPath all --check-explicit-interfaces"
|
||||
|
||||
Write-Host "Checking for incorrect conditional trait interface overrides..." -ForegroundColor Cyan
|
||||
Invoke-Expression "$utilityPath all --check-conditional-trait-interface-overrides"
|
||||
InvokeCommand "$utilityPath all --check-conditional-trait-interface-overrides"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,20 +152,6 @@ 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)
|
||||
@@ -201,6 +187,20 @@ 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,7 +223,6 @@ 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)
|
||||
}
|
||||
@@ -249,7 +248,6 @@ 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) }
|
||||
}
|
||||
|
||||
|
||||
@@ -20,12 +20,13 @@ Container@LOBBY_MUSIC_BIN:
|
||||
Height: 25
|
||||
Text: Track
|
||||
Font: Bold
|
||||
Label@TYPE:
|
||||
X: PARENT_RIGHT - 63
|
||||
Label@LENGTH:
|
||||
X: PARENT_RIGHT - 80
|
||||
Height: 25
|
||||
Width: 50
|
||||
Text: Length
|
||||
Font: Bold
|
||||
Align: Right
|
||||
Background@CONTROLS:
|
||||
Background: panel-transparent
|
||||
Width: 308
|
||||
|
||||
@@ -23,21 +23,21 @@ Container@LOBBY_OPTIONS_BIN:
|
||||
Height: 34
|
||||
Children:
|
||||
Checkbox@A:
|
||||
Width: 175
|
||||
Width: 220
|
||||
Height: 20
|
||||
Font: Regular
|
||||
Visible: False
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
Checkbox@B:
|
||||
X: 195
|
||||
Width: 175
|
||||
X: 225
|
||||
Width: 220
|
||||
Height: 20
|
||||
Font: Regular
|
||||
Visible: False
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
Checkbox@C:
|
||||
X: 375
|
||||
Width: 175
|
||||
X: 450
|
||||
Width: 190
|
||||
Height: 20
|
||||
Font: Regular
|
||||
Visible: False
|
||||
@@ -47,26 +47,26 @@ Container@LOBBY_OPTIONS_BIN:
|
||||
Width: PARENT_RIGHT
|
||||
Children:
|
||||
Label@A_DESC:
|
||||
Width: 80
|
||||
Width: 140
|
||||
Height: 25
|
||||
Align: Right
|
||||
Visible: False
|
||||
DropDownButton@A:
|
||||
X: 85
|
||||
Width: 160
|
||||
X: 145
|
||||
Width: 180
|
||||
Height: 25
|
||||
Font: Regular
|
||||
Visible: False
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
Label@B_DESC:
|
||||
X: PARENT_RIGHT - WIDTH - 183
|
||||
Width: 160
|
||||
X: PARENT_RIGHT - WIDTH - 203
|
||||
Width: 140
|
||||
Height: 25
|
||||
Align: Right
|
||||
Visible: False
|
||||
DropDownButton@B:
|
||||
X: PARENT_RIGHT - WIDTH - 18
|
||||
Width: 160
|
||||
Width: 180
|
||||
Height: 25
|
||||
Font: Regular
|
||||
Visible: False
|
||||
|
||||
@@ -16,34 +16,41 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Font: Bold
|
||||
Label@COLOR:
|
||||
X: 210
|
||||
Width: 76
|
||||
Width: 94
|
||||
Height: 25
|
||||
Text: Color
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@FACTION:
|
||||
X: 291
|
||||
X: 309
|
||||
Width: 120
|
||||
Height: 25
|
||||
Text: Faction
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@TEAM:
|
||||
X: 416
|
||||
X: 460-25
|
||||
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: 471
|
||||
X: 571
|
||||
Width: 50
|
||||
Height: 25
|
||||
Text: Spawn
|
||||
Align: Left
|
||||
Font: Bold
|
||||
Label@STATUS:
|
||||
X: 527
|
||||
X: 627
|
||||
Width: 20
|
||||
Height: 25
|
||||
Text: Ready
|
||||
@@ -108,7 +115,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Visible: false
|
||||
DropDownButton@COLOR:
|
||||
X: 210
|
||||
Width: 76
|
||||
Width: 94
|
||||
Height: 25
|
||||
Font: Regular
|
||||
IgnoreChildMouseOver: true
|
||||
@@ -119,7 +126,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Width: PARENT_RIGHT - 35
|
||||
Height: PARENT_BOTTOM - 12
|
||||
DropDownButton@FACTION:
|
||||
X: 291
|
||||
X: 309
|
||||
Width: 120
|
||||
Height: 25
|
||||
Font: Regular
|
||||
@@ -138,17 +145,24 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: 25
|
||||
Text: Faction
|
||||
DropDownButton@TEAM_DROPDOWN:
|
||||
X: 416
|
||||
X: 435
|
||||
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: 471
|
||||
X: 571
|
||||
Width: 50
|
||||
Height: 25
|
||||
Font: Regular
|
||||
Image@STATUS_IMAGE:
|
||||
X: 529
|
||||
X: 629
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -156,7 +170,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
ImageName: checked
|
||||
Visible: false
|
||||
Checkbox@STATUS_CHECKBOX:
|
||||
X: 527
|
||||
X: 627
|
||||
Y: 2
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -224,10 +238,10 @@ Container@LOBBY_PLAYER_BIN:
|
||||
ColorBlock@COLORBLOCK:
|
||||
X: 215
|
||||
Y: 6
|
||||
Width: 41
|
||||
Width: 59
|
||||
Height: 13
|
||||
Container@FACTION:
|
||||
X: 291
|
||||
X: 309
|
||||
Width: 120
|
||||
Height: 25
|
||||
Children:
|
||||
@@ -242,29 +256,41 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: 25
|
||||
Text: Faction
|
||||
Label@TEAM:
|
||||
X: 416
|
||||
Width: 25
|
||||
Height: 25
|
||||
Align: Center
|
||||
Label@SPAWN:
|
||||
X: 471
|
||||
X: 435
|
||||
Width: 25
|
||||
Height: 25
|
||||
Align: Center
|
||||
DropDownButton@TEAM_DROPDOWN:
|
||||
X: 416
|
||||
X: 435
|
||||
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: 471
|
||||
X: 571
|
||||
Width: 50
|
||||
Height: 25
|
||||
Font: Regular
|
||||
Visible: false
|
||||
Image@STATUS_IMAGE:
|
||||
X: 529
|
||||
X: 629
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -291,7 +317,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Visible: false
|
||||
Button@JOIN:
|
||||
X: 210
|
||||
Width: 338
|
||||
Width: 438
|
||||
Height: 25
|
||||
Text: Play in this slot
|
||||
Font: Regular
|
||||
@@ -340,13 +366,13 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Template: ANONYMOUS_PLAYER_TOOLTIP
|
||||
Label@SPECTATOR:
|
||||
X: 210
|
||||
Width: 341
|
||||
Width: 441
|
||||
Height: 25
|
||||
Text: Spectator
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Image@STATUS_IMAGE:
|
||||
X: 529
|
||||
X: 629
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -354,7 +380,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
ImageName: checked
|
||||
Visible: false
|
||||
Checkbox@STATUS_CHECKBOX:
|
||||
X: 527
|
||||
X: 627
|
||||
Y: 2
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -421,13 +447,13 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Template: ANONYMOUS_PLAYER_TOOLTIP
|
||||
Label@SPECTATOR:
|
||||
X: 210
|
||||
Width: 341
|
||||
Width: 441
|
||||
Height: 25
|
||||
Text: Spectator
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 627
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -448,7 +474,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Text: Allow Spectators?
|
||||
Button@SPECTATE:
|
||||
X: 210
|
||||
Width: 338
|
||||
Width: 438
|
||||
Height: 25
|
||||
Text: Spectate
|
||||
Font: Regular
|
||||
|
||||
@@ -9,32 +9,32 @@ Container@LOBBY_SERVERS_BIN:
|
||||
Children:
|
||||
Label@NAME:
|
||||
X: 5
|
||||
Width: 255
|
||||
Width: 355
|
||||
Height: 25
|
||||
Text: Server
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@PLAYERS:
|
||||
X: 290
|
||||
X: 390
|
||||
Width: 85
|
||||
Height: 25
|
||||
Text: Players
|
||||
Font: Bold
|
||||
Label@LOCATION:
|
||||
X: 380
|
||||
X: 480
|
||||
Width: 110
|
||||
Height: 25
|
||||
Text: Location
|
||||
Font: Bold
|
||||
Label@STATUS:
|
||||
X: 495
|
||||
X: 595
|
||||
Width: 50
|
||||
Height: 25
|
||||
Text: Status
|
||||
Font: Bold
|
||||
LogicTicker@NOTICE_WATCHER:
|
||||
Container@NOTICE_CONTAINER:
|
||||
Width: 582
|
||||
Width: PARENT_RIGHT
|
||||
Height: 19
|
||||
Children:
|
||||
Background@bg:
|
||||
@@ -87,12 +87,12 @@ Container@LOBBY_SERVERS_BIN:
|
||||
Children:
|
||||
LabelWithTooltip@TITLE:
|
||||
X: 5
|
||||
Width: 245
|
||||
Width: 345
|
||||
Height: 25
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
Image@PASSWORD_PROTECTED:
|
||||
X: 272
|
||||
X: 372
|
||||
Y: 6
|
||||
Width: 12
|
||||
Height: 13
|
||||
@@ -101,7 +101,7 @@ Container@LOBBY_SERVERS_BIN:
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
TooltipText: Requires Password
|
||||
Image@REQUIRES_AUTHENTICATION:
|
||||
X: 272
|
||||
X: 372
|
||||
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: 290
|
||||
X: 390
|
||||
Width: 85
|
||||
Height: 25
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
Label@LOCATION:
|
||||
X: 380
|
||||
X: 480
|
||||
Width: 110
|
||||
Height: 25
|
||||
Label@STATUS:
|
||||
X: 495
|
||||
X: 595
|
||||
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: 151
|
||||
Width: 180
|
||||
Height: 25
|
||||
Text: Filter Games
|
||||
Font: Bold
|
||||
Button@RELOAD_BUTTON:
|
||||
X: 156
|
||||
X: 185
|
||||
Y: PARENT_BOTTOM + 5
|
||||
Width: 26
|
||||
Height: 25
|
||||
|
||||
@@ -2,7 +2,7 @@ Container@SERVER_LOBBY:
|
||||
Logic: LobbyLogic
|
||||
X: (WINDOW_RIGHT - WIDTH) / 2
|
||||
Y: (WINDOW_BOTTOM - 560) / 2
|
||||
Width: 800
|
||||
Width: 900
|
||||
Height: 575
|
||||
Children:
|
||||
ColorPreviewManager@COLOR_MANAGER:
|
||||
@@ -25,55 +25,57 @@ Container@SERVER_LOBBY:
|
||||
DropDownButton@SLOTS_DROPDOWNBUTTON:
|
||||
X: 15
|
||||
Y: 254
|
||||
Width: 182
|
||||
Width: 211
|
||||
Height: 25
|
||||
Text: Slot Admin
|
||||
Container@SKIRMISH_TABS:
|
||||
X: 697 - WIDTH
|
||||
Width: 465
|
||||
Visible: False
|
||||
Children:
|
||||
Button@PLAYERS_TAB:
|
||||
X: 202
|
||||
Y: 248
|
||||
Width: 129
|
||||
Width: 151
|
||||
Height: 31
|
||||
Text: Players
|
||||
Button@OPTIONS_TAB:
|
||||
X: 336
|
||||
X: 157
|
||||
Y: 248
|
||||
Width: 128
|
||||
Width: 151
|
||||
Height: 31
|
||||
Text: Options
|
||||
Button@MUSIC_TAB:
|
||||
X: 469
|
||||
X: 314
|
||||
Y: 248
|
||||
Width: 128
|
||||
Width: 151
|
||||
Height: 31
|
||||
Text: Music
|
||||
Container@MULTIPLAYER_TABS:
|
||||
X: 697 - WIDTH
|
||||
Width: 465
|
||||
Visible: False
|
||||
Children:
|
||||
Button@PLAYERS_TAB:
|
||||
X: 202
|
||||
Y: 248
|
||||
Width: 95
|
||||
Width: 112
|
||||
Height: 31
|
||||
Text: Players
|
||||
Button@OPTIONS_TAB:
|
||||
X: 302
|
||||
X: 118
|
||||
Y: 248
|
||||
Width: 95
|
||||
Width: 112
|
||||
Height: 31
|
||||
Text: Options
|
||||
Button@MUSIC_TAB:
|
||||
X: 402
|
||||
X: 236
|
||||
Y: 248
|
||||
Width: 95
|
||||
Width: 112
|
||||
Height: 31
|
||||
Text: Music
|
||||
Button@SERVERS_TAB:
|
||||
X: 502
|
||||
X: 354
|
||||
Y: 248
|
||||
Width: 95
|
||||
Width: 111
|
||||
Height: 31
|
||||
Text: Servers
|
||||
Button@CHANGEMAP_BUTTON:
|
||||
@@ -85,7 +87,7 @@ Container@SERVER_LOBBY:
|
||||
Container@TOP_PANELS_ROOT:
|
||||
X: 15
|
||||
Y: 30
|
||||
Width: 582
|
||||
Width: 682
|
||||
Height: 219
|
||||
Container@LOBBYCHAT:
|
||||
X: 15
|
||||
|
||||
@@ -2,7 +2,7 @@ Container@MAPCHOOSER_PANEL:
|
||||
Logic: MapChooserLogic
|
||||
X: (WINDOW_RIGHT - WIDTH) / 2
|
||||
Y: (WINDOW_BOTTOM - 560) / 2
|
||||
Width: 800
|
||||
Width: 900
|
||||
Height: 575
|
||||
Children:
|
||||
Label@TITLE:
|
||||
@@ -64,7 +64,7 @@ Container@MAPCHOOSER_PANEL:
|
||||
ScrollPanel@MAP_LIST:
|
||||
Width: PARENT_RIGHT
|
||||
Height: PARENT_BOTTOM
|
||||
Children:
|
||||
ItemSpacing: 1
|
||||
Container@USER_MAPS_TAB:
|
||||
X: 15
|
||||
Y: 45
|
||||
@@ -74,18 +74,18 @@ Container@MAPCHOOSER_PANEL:
|
||||
ScrollPanel@MAP_LIST:
|
||||
Width: PARENT_RIGHT
|
||||
Height: PARENT_BOTTOM
|
||||
Children:
|
||||
ItemSpacing: 1
|
||||
ScrollItem@MAP_TEMPLATE:
|
||||
Width: 183
|
||||
Height: 232
|
||||
X: 2
|
||||
Width: 210
|
||||
Height: 262
|
||||
X: 1
|
||||
Visible: false
|
||||
Children:
|
||||
MapPreview@PREVIEW:
|
||||
X: (PARENT_RIGHT - WIDTH) / 2
|
||||
Y: 4
|
||||
Width: 173
|
||||
Height: 173
|
||||
Y: 3
|
||||
Width: 204
|
||||
Height: 204
|
||||
IgnoreMouseOver: true
|
||||
IgnoreMouseInput: true
|
||||
Label@TITLE:
|
||||
|
||||
@@ -2,7 +2,7 @@ Container@MULTIPLAYER_PANEL:
|
||||
Logic: MultiplayerLogic
|
||||
X: (WINDOW_RIGHT - WIDTH) / 2
|
||||
Y: (WINDOW_BOTTOM - 560) / 2
|
||||
Width: 800
|
||||
Width: 900
|
||||
Height: 575
|
||||
Children:
|
||||
Label@TITLE:
|
||||
@@ -25,25 +25,25 @@ Container@MULTIPLAYER_PANEL:
|
||||
Children:
|
||||
Label@NAME:
|
||||
X: 5
|
||||
Width: 255
|
||||
Width: 355
|
||||
Height: 25
|
||||
Text: Server
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@PLAYERS:
|
||||
X: 290
|
||||
X: 390
|
||||
Width: 85
|
||||
Height: 25
|
||||
Text: Players
|
||||
Font: Bold
|
||||
Label@LOCATION:
|
||||
X: 380
|
||||
X: 480
|
||||
Width: 110
|
||||
Height: 25
|
||||
Text: Location
|
||||
Font: Bold
|
||||
Label@STATUS:
|
||||
X: 495
|
||||
X: 595
|
||||
Width: 50
|
||||
Height: 25
|
||||
Text: Status
|
||||
@@ -52,7 +52,7 @@ Container@MULTIPLAYER_PANEL:
|
||||
Container@NOTICE_CONTAINER:
|
||||
X: 15
|
||||
Y: 30
|
||||
Width: 582
|
||||
Width: 682
|
||||
Height: 19
|
||||
Children:
|
||||
Background@bg:
|
||||
@@ -84,7 +84,7 @@ Container@MULTIPLAYER_PANEL:
|
||||
ScrollPanel@SERVER_LIST:
|
||||
X: 15
|
||||
Y: 30
|
||||
Width: 582
|
||||
Width: 682
|
||||
Height: PARENT_BOTTOM - 75
|
||||
TopBottomSpacing: 2
|
||||
Children:
|
||||
@@ -107,12 +107,12 @@ Container@MULTIPLAYER_PANEL:
|
||||
Children:
|
||||
LabelWithTooltip@TITLE:
|
||||
X: 5
|
||||
Width: 245
|
||||
Width: 345
|
||||
Height: 25
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
Image@PASSWORD_PROTECTED:
|
||||
X: 272
|
||||
X: 372
|
||||
Y: 6
|
||||
Width: 12
|
||||
Height: 13
|
||||
@@ -121,7 +121,7 @@ Container@MULTIPLAYER_PANEL:
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
TooltipText: Requires Password
|
||||
Image@REQUIRES_AUTHENTICATION:
|
||||
X: 272
|
||||
X: 372
|
||||
Y: 6
|
||||
Width: 12
|
||||
Height: 13
|
||||
@@ -130,23 +130,23 @@ Container@MULTIPLAYER_PANEL:
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
TooltipText: Requires OpenRA forum account
|
||||
LabelWithTooltip@PLAYERS:
|
||||
X: 290
|
||||
X: 390
|
||||
Width: 85
|
||||
Height: 25
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
Label@LOCATION:
|
||||
X: 380
|
||||
X: 480
|
||||
Width: 110
|
||||
Height: 25
|
||||
Label@STATUS:
|
||||
X: 495
|
||||
X: 595
|
||||
Width: 50
|
||||
Height: 25
|
||||
Label@PROGRESS_LABEL:
|
||||
X: 15
|
||||
Y: 31 + (PARENT_BOTTOM - 75 - HEIGHT) / 2
|
||||
Width: 582
|
||||
Width: 682
|
||||
Height: 25
|
||||
Font: Bold
|
||||
Align: Center
|
||||
@@ -231,20 +231,20 @@ Container@MULTIPLAYER_PANEL:
|
||||
Children:
|
||||
LogicTicker@ANIMATION:
|
||||
Label@PLAYER_COUNT:
|
||||
X: 198
|
||||
X: 248
|
||||
Y: PARENT_BOTTOM - 40
|
||||
Width: 189
|
||||
Height: 25
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Button@DIRECTCONNECT_BUTTON:
|
||||
X: 387
|
||||
X: 487
|
||||
Y: PARENT_BOTTOM - 40
|
||||
Width: 100
|
||||
Height: 25
|
||||
Text: Direct IP
|
||||
Button@CREATE_BUTTON:
|
||||
X: 492
|
||||
X: 592
|
||||
Y: PARENT_BOTTOM - 40
|
||||
Width: 105
|
||||
Height: 25
|
||||
|
||||
@@ -552,7 +552,7 @@ Actors:
|
||||
Health: 99
|
||||
Actor171: hosp
|
||||
Location: 55,28
|
||||
Owner: Civilians
|
||||
Owner: GDI
|
||||
Actor172: mtnk
|
||||
Location: 51,40
|
||||
Owner: GDI
|
||||
|
||||
@@ -67,7 +67,7 @@ HELI:
|
||||
TurnSpeed: 28
|
||||
Speed: 180
|
||||
Health:
|
||||
HP: 12000
|
||||
HP: 12500
|
||||
Armor:
|
||||
Type: Light
|
||||
RevealsShroud:
|
||||
|
||||
@@ -187,6 +187,11 @@
|
||||
AttackMove:
|
||||
AssaultMoveCondition: assault-move
|
||||
|
||||
^PlayerHandicaps:
|
||||
HandicapFirepowerMultiplier:
|
||||
HandicapDamageMultiplier:
|
||||
HandicapProductionTimeMultiplier:
|
||||
|
||||
^AcceptsCloakCrate:
|
||||
Cloak:
|
||||
InitialDelay: 15
|
||||
@@ -224,6 +229,7 @@
|
||||
Inherits@1: ^ExistsInWorld
|
||||
Inherits@3: ^ClassicFacingSpriteActor
|
||||
Inherits@selection: ^SelectableCombatUnit
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Huntable:
|
||||
OwnerLostAction:
|
||||
Action: Kill
|
||||
@@ -269,6 +275,7 @@
|
||||
Inherits@1: ^ExistsInWorld
|
||||
Inherits@3: ^ClassicFacingSpriteActor
|
||||
Inherits@selection: ^SelectableCombatUnit
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Huntable:
|
||||
OwnerLostAction:
|
||||
Action: Kill
|
||||
@@ -323,6 +330,7 @@
|
||||
Inherits@1: ^ExistsInWorld
|
||||
Inherits@3: ^SpriteActor
|
||||
Inherits@selection: ^SelectableCombatUnit
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Huntable:
|
||||
OwnerLostAction:
|
||||
Action: Kill
|
||||
@@ -492,6 +500,7 @@
|
||||
Inherits@2: ^SpriteActor
|
||||
Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove
|
||||
Inherits@selection: ^SelectableCombatUnit
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Huntable:
|
||||
OwnerLostAction:
|
||||
Action: Kill
|
||||
@@ -546,11 +555,12 @@
|
||||
Inherits@2: ^SpriteActor
|
||||
Inherits@AUTOTARGET: ^AutoTargetGroundAssaultMove
|
||||
Inherits@selection: ^SelectableCombatUnit
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Huntable:
|
||||
Health:
|
||||
HP: 30000
|
||||
HP: 40000
|
||||
Armor:
|
||||
Type: Wood
|
||||
Type: Light
|
||||
RevealsShroud:
|
||||
Range: 6c0
|
||||
Mobile:
|
||||
@@ -601,6 +611,7 @@
|
||||
^Plane:
|
||||
Inherits@1: ^ExistsInWorld
|
||||
Inherits@2: ^ClassicFacingSpriteActor
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Huntable:
|
||||
OwnerLostAction:
|
||||
Action: Kill
|
||||
@@ -626,6 +637,7 @@
|
||||
Inherits@1: ^ExistsInWorld
|
||||
Inherits@3: ^SpriteActor
|
||||
Inherits@selection: ^SelectableCombatUnit
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Huntable:
|
||||
OwnerLostAction:
|
||||
Action: Kill
|
||||
@@ -653,6 +665,7 @@
|
||||
Inherits@2: ^SpriteActor
|
||||
Inherits@shape: ^1x1Shape
|
||||
Inherits@selection: ^SelectableBuilding
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Huntable:
|
||||
OwnerLostAction:
|
||||
Action: Kill
|
||||
@@ -668,8 +681,8 @@
|
||||
ActorPreviewPlaceBuildingPreview:
|
||||
OverridePalette: placebuilding
|
||||
SoundOnDamageTransition:
|
||||
DamagedSounds: xplos.aud
|
||||
DestroyedSounds: crumble.aud
|
||||
DamagedSounds: xplobig4.aud
|
||||
DestroyedSounds: crumble.aud, xplobig4.aud
|
||||
WithSpriteBody:
|
||||
Explodes:
|
||||
Type: Footprint
|
||||
@@ -992,9 +1005,9 @@
|
||||
Inherits@1: ^ClassicFacingSpriteActor
|
||||
Interactable:
|
||||
Health:
|
||||
HP: 14000
|
||||
HP: 28000
|
||||
Armor:
|
||||
Type: Light
|
||||
Type: Heavy
|
||||
HiddenUnderFog:
|
||||
Type: CenterPosition
|
||||
AlwaysVisibleRelationships: None
|
||||
@@ -1029,14 +1042,14 @@
|
||||
Sequence: 1
|
||||
IsDecoration: True
|
||||
ChangesHealth:
|
||||
Step: -100
|
||||
Step: -200
|
||||
StartIfBelow: 101
|
||||
Delay: 6
|
||||
|
||||
^LightHusk:
|
||||
Inherits: ^Husk
|
||||
Health:
|
||||
HP: 2000
|
||||
HP: 4000
|
||||
|
||||
^HelicopterHusk:
|
||||
Inherits: ^CommonHuskDefaults
|
||||
|
||||
@@ -80,6 +80,9 @@ HARV:
|
||||
EffectiveOwnerFromOwner: true
|
||||
WithHarvestAnimation:
|
||||
WithDockingAnimation:
|
||||
Explodes@EMPTY:
|
||||
Weapon: UnitExplodeHarvEmpty
|
||||
EmptyWeapon: UnitExplodeHarvEmpty
|
||||
Explodes:
|
||||
RequiresCondition: !no-tiberium
|
||||
Weapon: TiberiumExplosion
|
||||
@@ -160,6 +163,9 @@ APC:
|
||||
Types: Infantry
|
||||
MaxWeight: 5
|
||||
LoadingCondition: notmobile
|
||||
Explodes:
|
||||
Weapon: UnitExplodeBig
|
||||
EmptyWeapon: UnitExplodeBig
|
||||
SpawnActorOnDeath:
|
||||
Actor: APC.Husk
|
||||
OwnerType: InternalName
|
||||
@@ -454,6 +460,9 @@ MTNK:
|
||||
AttackTurreted:
|
||||
WithMuzzleOverlay:
|
||||
WithSpriteTurret:
|
||||
Explodes:
|
||||
Weapon: UnitExplodeBig
|
||||
EmptyWeapon: UnitExplodeBig
|
||||
SpawnActorOnDeath:
|
||||
Actor: MTNK.Husk
|
||||
OwnerType: InternalName
|
||||
@@ -512,6 +521,9 @@ HTNK:
|
||||
Delay: 10
|
||||
StartIfBelow: 50
|
||||
DamageCooldown: 200
|
||||
Explodes:
|
||||
Weapon: UnitExplodeMech
|
||||
EmptyWeapon: UnitExplodeMech
|
||||
SpawnActorOnDeath:
|
||||
Actor: HTNK.Husk
|
||||
OwnerType: InternalName
|
||||
@@ -560,6 +572,9 @@ MSAM:
|
||||
TargetFrozenActors: True
|
||||
ForceFireIgnoresActors: True
|
||||
WithSpriteTurret:
|
||||
Explodes:
|
||||
Weapon: UnitExplodeMech
|
||||
EmptyWeapon: UnitExplodeMech
|
||||
SpawnActorOnDeath:
|
||||
Actor: MSAM.Husk
|
||||
OwnerType: InternalName
|
||||
@@ -629,7 +644,7 @@ STNK:
|
||||
Inherits@EXPERIENCE: ^GainsExperience
|
||||
Inherits@AUTOTARGET: ^AutoTargetAllAssaultMove
|
||||
Valued:
|
||||
Cost: 1000
|
||||
Cost: 900
|
||||
Tooltip:
|
||||
Name: Stealth Tank
|
||||
UpdatesPlayerStatistics:
|
||||
@@ -648,7 +663,7 @@ STNK:
|
||||
Health:
|
||||
HP: 15000
|
||||
Repairable:
|
||||
HpPerStep: 682
|
||||
HpPerStep: 758
|
||||
Armor:
|
||||
Type: Light
|
||||
RevealsShroud:
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
120mm:
|
||||
Inherits: ^BallisticWeapon
|
||||
Report: tnkfire4.aud
|
||||
|
||||
120mmDual:
|
||||
Inherits: ^BallisticWeapon
|
||||
|
||||
@@ -33,7 +33,7 @@ FlametankExplode:
|
||||
DamageTypes: Prone50Percent, TriggerProne, FireDeath
|
||||
Warhead@2Eff: CreateEffect
|
||||
Explosions: big_napalm
|
||||
ImpactSounds: xplobig6.aud
|
||||
ImpactSounds: flamer2.aud
|
||||
Warhead@3Smu: LeaveSmudge
|
||||
SmudgeType: Scorch
|
||||
|
||||
@@ -74,8 +74,26 @@ 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: UnitExplodeSmall
|
||||
Inherits: UnitExplodeBig
|
||||
Warhead@1Dam: SpreadDamage
|
||||
InvalidTargets: StealthTank
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ Rockets:
|
||||
|
||||
BikeRockets:
|
||||
Inherits: ^MissileWeapon
|
||||
ReloadDelay: 60
|
||||
Burst: 2
|
||||
BurstDelays: 10
|
||||
Projectile: Missile
|
||||
@@ -129,6 +130,7 @@ MammothMissiles:
|
||||
Heavy: 44
|
||||
Warhead@3Eff: CreateEffect
|
||||
Explosions: small_poof
|
||||
ImpactSounds: xplobig4.aud
|
||||
Warhead@4EffAir: CreateEffect
|
||||
Explosions: small_building
|
||||
|
||||
@@ -163,6 +165,7 @@ MammothMissiles:
|
||||
Heavy: 48
|
||||
Warhead@3Eff: CreateEffect
|
||||
Explosions: med_frag
|
||||
ImpactSounds: xplobig4.aud
|
||||
|
||||
227mm.stnk:
|
||||
Inherits: ^MissileWeapon
|
||||
@@ -213,6 +216,7 @@ BoatMissile:
|
||||
DamageTypes: Prone50Percent, TriggerProne, SmallExplosionDeath
|
||||
Warhead@3Eff: CreateEffect
|
||||
Explosions: small_poof
|
||||
ImpactSounds: xplobig4.aud
|
||||
Warhead@4EffAir: CreateEffect
|
||||
Explosions: small_building
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Sniper:
|
||||
Report: ramgun2.aud
|
||||
ValidTargets: Ground, Infantry
|
||||
InvalidTargets: Vehicle, Water, Structure, Wall, Husk
|
||||
InvalidTargets: Vehicle, Water, Structure, Wall, Husk, Creep
|
||||
ReloadDelay: 40
|
||||
Range: 8c0
|
||||
Projectile: Bullet
|
||||
@@ -72,7 +72,7 @@ HeliAGGun:
|
||||
Damage: 2000
|
||||
Versus:
|
||||
None: 100
|
||||
Wood: 50
|
||||
Wood: 75
|
||||
Light: 75
|
||||
Heavy: 25
|
||||
DamageTypes: Prone80Percent, TriggerProne, RippedApartDeath
|
||||
@@ -175,6 +175,6 @@ APCGun.AA:
|
||||
Warhead@1Dam: SpreadDamage
|
||||
ValidTargets: Air
|
||||
Versus:
|
||||
Light: 140
|
||||
Light: 125
|
||||
Warhead@2Eff: CreateEffect
|
||||
Explosions: small_poof
|
||||
|
||||
@@ -20,12 +20,13 @@ Container@LOBBY_MUSIC_BIN:
|
||||
Height: 25
|
||||
Text: Track
|
||||
Font: Bold
|
||||
Label@TYPE:
|
||||
X: PARENT_RIGHT - 63
|
||||
Label@LENGTH:
|
||||
X: PARENT_RIGHT - 80
|
||||
Height: 25
|
||||
Width: 50
|
||||
Text: Length
|
||||
Font: Bold
|
||||
Align: Right
|
||||
Background@CONTROLS:
|
||||
Background: dialog3
|
||||
Width: 268
|
||||
|
||||
@@ -23,19 +23,19 @@ Container@LOBBY_OPTIONS_BIN:
|
||||
Height: 30
|
||||
Children:
|
||||
Checkbox@A:
|
||||
Width: 175
|
||||
Width: 220
|
||||
Height: 20
|
||||
Visible: False
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
Checkbox@B:
|
||||
X: 190
|
||||
Width: 175
|
||||
X: 225
|
||||
Width: 220
|
||||
Height: 20
|
||||
Visible: False
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
Checkbox@C:
|
||||
X: 375
|
||||
Width: 175
|
||||
X: 450
|
||||
Width: 190
|
||||
Height: 20
|
||||
Visible: False
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
@@ -44,25 +44,25 @@ Container@LOBBY_OPTIONS_BIN:
|
||||
Width: PARENT_RIGHT
|
||||
Children:
|
||||
Label@A_DESC:
|
||||
Width: 90
|
||||
Width: 140
|
||||
Height: 25
|
||||
Align: Right
|
||||
Visible: False
|
||||
DropDownButton@A:
|
||||
X: 95
|
||||
Width: 160
|
||||
X: 145
|
||||
Width: 180
|
||||
Height: 25
|
||||
Visible: False
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
Label@B_DESC:
|
||||
X: PARENT_RIGHT - WIDTH - 183
|
||||
Width: 160
|
||||
X: PARENT_RIGHT - WIDTH - 203
|
||||
Width: 140
|
||||
Height: 25
|
||||
Align: Right
|
||||
Visible: False
|
||||
DropDownButton@B:
|
||||
X: PARENT_RIGHT - WIDTH - 18
|
||||
Width: 160
|
||||
Width: 180
|
||||
Height: 25
|
||||
Font: Regular
|
||||
Visible: False
|
||||
|
||||
@@ -23,27 +23,34 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Font: Bold
|
||||
Label@LABEL_LOBBY_FACTION:
|
||||
X: 270
|
||||
Width: 130
|
||||
Width: 140
|
||||
Height: 25
|
||||
Text: Faction
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@LABEL_LOBBY_TEAM:
|
||||
X: 410
|
||||
X: 420
|
||||
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: 468
|
||||
X: 560
|
||||
Width: 48
|
||||
Height: 25
|
||||
Text: Spawn
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@LABEL_LOBBY_STATUS:
|
||||
X: 525
|
||||
X: 617
|
||||
Width: 20
|
||||
Height: 25
|
||||
Text: Ready
|
||||
@@ -118,7 +125,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: PARENT_BOTTOM - 12
|
||||
DropDownButton@FACTION:
|
||||
X: 270
|
||||
Width: 130
|
||||
Width: 140
|
||||
Height: 25
|
||||
IgnoreChildMouseOver: true
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
@@ -135,23 +142,29 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: 25
|
||||
Text: Faction
|
||||
DropDownButton@TEAM_DROPDOWN:
|
||||
X: 410
|
||||
X: 420
|
||||
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: 468
|
||||
X: 560
|
||||
Width: 48
|
||||
Height: 25
|
||||
Text: Spawn
|
||||
Checkbox@STATUS_CHECKBOX:
|
||||
X: 525
|
||||
X: 617
|
||||
Y: 2
|
||||
Width: 20
|
||||
Height: 20
|
||||
Visible: false
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 619
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -225,7 +238,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: 13
|
||||
Container@FACTION:
|
||||
X: 270
|
||||
Width: 150
|
||||
Width: 160
|
||||
Height: 25
|
||||
Children:
|
||||
Image@FACTIONFLAG:
|
||||
@@ -239,28 +252,39 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: 25
|
||||
Text: Faction
|
||||
Label@TEAM:
|
||||
X: 410
|
||||
X: 420
|
||||
Width: 23
|
||||
Height: 25
|
||||
Text: Team
|
||||
Align: Center
|
||||
Label@SPAWN:
|
||||
X: 468
|
||||
Width: 23
|
||||
Height: 25
|
||||
Align: Center
|
||||
DropDownButton@TEAM_DROPDOWN:
|
||||
X: 410
|
||||
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
|
||||
Width: 23
|
||||
Height: 25
|
||||
Align: Center
|
||||
DropDownButton@SPAWN_DROPDOWN:
|
||||
X: 468
|
||||
X: 560
|
||||
Width: 48
|
||||
Height: 25
|
||||
Visible: false
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 619
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -287,7 +311,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Button@JOIN:
|
||||
X: 190
|
||||
Text: Play in this slot
|
||||
Width: 326
|
||||
Width: 418
|
||||
Height: 25
|
||||
Container@TEMPLATE_EDITABLE_SPECTATOR:
|
||||
X: 5
|
||||
@@ -333,19 +357,19 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Template: ANONYMOUS_PLAYER_TOOLTIP
|
||||
Label@SPECTATOR:
|
||||
X: 190
|
||||
Width: 326
|
||||
Width: 418
|
||||
Height: 25
|
||||
Text: Spectator
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Checkbox@STATUS_CHECKBOX:
|
||||
X: 525
|
||||
X: 617
|
||||
Y: 2
|
||||
Width: 20
|
||||
Height: 20
|
||||
Visible: false
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 619
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -414,13 +438,13 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Template: ANONYMOUS_PLAYER_TOOLTIP
|
||||
Label@SPECTATOR:
|
||||
X: 190
|
||||
Width: 326
|
||||
Width: 418
|
||||
Height: 25
|
||||
Text: Spectator
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 619
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -441,7 +465,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Text: Allow Spectators?
|
||||
Button@SPECTATE:
|
||||
X: 190
|
||||
Width: 326
|
||||
Width: 418
|
||||
Height: 25
|
||||
Text: Spectate
|
||||
Font: Regular
|
||||
|
||||
@@ -9,32 +9,32 @@ Container@LOBBY_SERVERS_BIN:
|
||||
Children:
|
||||
Label@NAME:
|
||||
X: 5
|
||||
Width: 255
|
||||
Width: 347
|
||||
Height: 25
|
||||
Text: Server
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@PLAYERS:
|
||||
X: 290
|
||||
X: 382
|
||||
Width: 85
|
||||
Height: 25
|
||||
Text: Players
|
||||
Font: Bold
|
||||
Label@LOCATION:
|
||||
X: 380
|
||||
X: 472
|
||||
Width: 110
|
||||
Height: 25
|
||||
Text: Location
|
||||
Font: Bold
|
||||
Label@STATUS:
|
||||
X: 495
|
||||
X: 587
|
||||
Width: 50
|
||||
Height: 25
|
||||
Text: Status
|
||||
Font: Bold
|
||||
LogicTicker@NOTICE_WATCHER:
|
||||
Background@NOTICE_CONTAINER:
|
||||
Width: 583
|
||||
Width: PARENT_RIGHT
|
||||
Height: 20
|
||||
Background: dialog2
|
||||
Children:
|
||||
@@ -83,12 +83,12 @@ Container@LOBBY_SERVERS_BIN:
|
||||
Children:
|
||||
LabelWithTooltip@TITLE:
|
||||
X: 5
|
||||
Width: 245
|
||||
Width: 337
|
||||
Height: 25
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
Image@PASSWORD_PROTECTED:
|
||||
X: 272
|
||||
X: 364
|
||||
Y: 6
|
||||
Width: 12
|
||||
Height: 13
|
||||
@@ -97,7 +97,7 @@ Container@LOBBY_SERVERS_BIN:
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
TooltipText: Requires Password
|
||||
Image@REQUIRES_AUTHENTICATION:
|
||||
X: 272
|
||||
X: 364
|
||||
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: 290
|
||||
X: 382
|
||||
Width: 85
|
||||
Height: 25
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
Label@LOCATION:
|
||||
X: 380
|
||||
X: 472
|
||||
Width: 110
|
||||
Height: 25
|
||||
Label@STATUS:
|
||||
X: 495
|
||||
X: 587
|
||||
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: 147
|
||||
Width: 154
|
||||
Height: 25
|
||||
Text: Filter Games
|
||||
Font: Bold
|
||||
Button@RELOAD_BUTTON:
|
||||
X: 152
|
||||
X: 159
|
||||
Y: PARENT_BOTTOM + 5
|
||||
Width: 26
|
||||
Height: 25
|
||||
|
||||
@@ -2,7 +2,7 @@ Background@SERVER_LOBBY:
|
||||
Logic: LobbyLogic
|
||||
X: (WINDOW_RIGHT - WIDTH) / 2
|
||||
Y: (WINDOW_BOTTOM - HEIGHT) / 2
|
||||
Width: 808
|
||||
Width: 900
|
||||
Height: 600
|
||||
Children:
|
||||
ColorPreviewManager@COLOR_MANAGER:
|
||||
@@ -20,69 +20,71 @@ Background@SERVER_LOBBY:
|
||||
DropDownButton@SLOTS_DROPDOWNBUTTON:
|
||||
X: 20
|
||||
Y: 291
|
||||
Width: 178
|
||||
Width: 185
|
||||
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: 134
|
||||
Width: 162
|
||||
Height: 31
|
||||
Font: Bold
|
||||
Text: Players
|
||||
Button@OPTIONS_TAB:
|
||||
X: 337
|
||||
X: 162
|
||||
Y: 285
|
||||
Width: 133
|
||||
Width: 162
|
||||
Height: 31
|
||||
Font: Bold
|
||||
Text: Options
|
||||
Button@MUSIC_TAB:
|
||||
X: 470
|
||||
X: 2*162
|
||||
Y: 285
|
||||
Width: 133
|
||||
Width: 162
|
||||
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: 100
|
||||
Width: 121
|
||||
Height: 31
|
||||
Font: Bold
|
||||
Text: Players
|
||||
Button@OPTIONS_TAB:
|
||||
X: 303
|
||||
X: 121
|
||||
Y: 285
|
||||
Width: 100
|
||||
Width: 122
|
||||
Height: 31
|
||||
Font: Bold
|
||||
Text: Options
|
||||
Button@MUSIC_TAB:
|
||||
X: 403
|
||||
X: 243
|
||||
Y: 285
|
||||
Width: 100
|
||||
Width: 121
|
||||
Height: 31
|
||||
Font: Bold
|
||||
Text: Music
|
||||
Button@SERVERS_TAB:
|
||||
X: 503
|
||||
X: 364
|
||||
Y: 285
|
||||
Width: 100
|
||||
Width: 122
|
||||
Height: 31
|
||||
Font: Bold
|
||||
Text: Servers
|
||||
Container@TOP_PANELS_ROOT:
|
||||
X: 20
|
||||
Y: 67
|
||||
Width: 583
|
||||
Width: 675
|
||||
Height: 219
|
||||
Button@CHANGEMAP_BUTTON:
|
||||
X: PARENT_RIGHT - WIDTH - 20
|
||||
|
||||
@@ -2,7 +2,7 @@ Background@MAPCHOOSER_PANEL:
|
||||
X: (WINDOW_RIGHT - WIDTH) / 2
|
||||
Y: (WINDOW_BOTTOM - HEIGHT) / 2
|
||||
Logic: MapChooserLogic
|
||||
Width: 808
|
||||
Width: 900
|
||||
Height: 600
|
||||
Children:
|
||||
Label@MAPCHOOSER_TITLE:
|
||||
@@ -47,16 +47,16 @@ Background@MAPCHOOSER_PANEL:
|
||||
Height: PARENT_BOTTOM
|
||||
Children:
|
||||
ScrollItem@MAP_TEMPLATE:
|
||||
Width: 185
|
||||
Height: 243
|
||||
Width: 208
|
||||
Height: 266
|
||||
X: 2
|
||||
Visible: false
|
||||
Children:
|
||||
MapPreview@PREVIEW:
|
||||
X: (PARENT_RIGHT - WIDTH) / 2
|
||||
Y: 3
|
||||
Width: 179
|
||||
Height: 179
|
||||
Width: 202
|
||||
Height: 202
|
||||
IgnoreMouseOver: true
|
||||
IgnoreMouseInput: true
|
||||
Label@TITLE:
|
||||
|
||||
@@ -2,7 +2,7 @@ Background@MULTIPLAYER_PANEL:
|
||||
Logic: MultiplayerLogic
|
||||
X: (WINDOW_RIGHT - WIDTH) / 2
|
||||
Y: (WINDOW_BOTTOM - HEIGHT) / 2
|
||||
Width: 808
|
||||
Width: 900
|
||||
Height: 600
|
||||
Children:
|
||||
Label@TITLE:
|
||||
@@ -20,25 +20,25 @@ Background@MULTIPLAYER_PANEL:
|
||||
Children:
|
||||
Label@NAME:
|
||||
X: 5
|
||||
Width: 255
|
||||
Width: 347
|
||||
Height: 25
|
||||
Text: Server
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@PLAYERS:
|
||||
X: 290
|
||||
X: 382
|
||||
Width: 85
|
||||
Height: 25
|
||||
Text: Players
|
||||
Font: Bold
|
||||
Label@LOCATION:
|
||||
X: 380
|
||||
X: 472
|
||||
Width: 110
|
||||
Height: 25
|
||||
Text: Location
|
||||
Font: Bold
|
||||
Label@STATUS:
|
||||
X: 495
|
||||
X: 587
|
||||
Width: 50
|
||||
Height: 25
|
||||
Text: Status
|
||||
@@ -47,7 +47,7 @@ Background@MULTIPLAYER_PANEL:
|
||||
Background@NOTICE_CONTAINER:
|
||||
X: 20
|
||||
Y: 67
|
||||
Width: 583
|
||||
Width: 675
|
||||
Height: 20
|
||||
Background: dialog2
|
||||
Children:
|
||||
@@ -75,7 +75,7 @@ Background@MULTIPLAYER_PANEL:
|
||||
ScrollPanel@SERVER_LIST:
|
||||
X: 20
|
||||
Y: 67
|
||||
Width: 583
|
||||
Width: 675
|
||||
Height: PARENT_BOTTOM - 119
|
||||
TopBottomSpacing: 2
|
||||
Children:
|
||||
@@ -99,12 +99,12 @@ Background@MULTIPLAYER_PANEL:
|
||||
Children:
|
||||
LabelWithTooltip@TITLE:
|
||||
X: 5
|
||||
Width: 245
|
||||
Width: 337
|
||||
Height: 25
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
Image@PASSWORD_PROTECTED:
|
||||
X: 272
|
||||
X: 364
|
||||
Y: 6
|
||||
Width: 12
|
||||
Height: 13
|
||||
@@ -113,7 +113,7 @@ Background@MULTIPLAYER_PANEL:
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
TooltipText: Requires Password
|
||||
Image@REQUIRES_AUTHENTICATION:
|
||||
X: 272
|
||||
X: 364
|
||||
Y: 6
|
||||
Width: 12
|
||||
Height: 13
|
||||
@@ -122,23 +122,23 @@ Background@MULTIPLAYER_PANEL:
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
TooltipText: Requires OpenRA forum account
|
||||
LabelWithTooltip@PLAYERS:
|
||||
X: 290
|
||||
X: 382
|
||||
Width: 85
|
||||
Height: 25
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
TooltipTemplate: SIMPLE_TOOLTIP
|
||||
Label@LOCATION:
|
||||
X: 380
|
||||
X: 472
|
||||
Width: 110
|
||||
Height: 25
|
||||
Label@STATUS:
|
||||
X: 495
|
||||
X: 587
|
||||
Width: 50
|
||||
Height: 25
|
||||
Label@PROGRESS_LABEL:
|
||||
X: 20
|
||||
Y: 67 + (PARENT_BOTTOM - 119 - HEIGHT) / 2
|
||||
Width: 582
|
||||
Width: 675
|
||||
Height: 25
|
||||
Font: Bold
|
||||
Align: Center
|
||||
@@ -225,21 +225,21 @@ Background@MULTIPLAYER_PANEL:
|
||||
Children:
|
||||
LogicTicker@ANIMATION:
|
||||
Label@PLAYER_COUNT:
|
||||
X: 208
|
||||
X: 254
|
||||
Y: PARENT_BOTTOM - HEIGHT - 20
|
||||
Width: 190
|
||||
Height: 25
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Button@DIRECTCONNECT_BUTTON:
|
||||
X: 398
|
||||
X: 490
|
||||
Y: PARENT_BOTTOM - HEIGHT - 20
|
||||
Width: 100
|
||||
Height: 25
|
||||
Text: Direct IP
|
||||
Font: Bold
|
||||
Button@CREATE_BUTTON:
|
||||
X: 503
|
||||
X: 595
|
||||
Y: PARENT_BOTTOM - HEIGHT - 20
|
||||
Width: 100
|
||||
Height: 25
|
||||
|
||||
@@ -188,12 +188,19 @@ Background@SETTINGS_PANEL:
|
||||
Font: Regular
|
||||
Text: Increase Cursor Size
|
||||
Checkbox@PLAYER_STANCE_COLORS_CHECKBOX:
|
||||
X: 310
|
||||
X: 195
|
||||
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
|
||||
|
||||
@@ -62,10 +62,10 @@ Speech:
|
||||
Sounds:
|
||||
DefaultVariant: .WAV
|
||||
Notifications:
|
||||
RadarUp: MULTI1
|
||||
RadarUp: RADRON1
|
||||
RadarDown:
|
||||
DisablePower: POWRUP1
|
||||
EnablePower: POWRDN1
|
||||
DisablePower: POWRDN1
|
||||
EnablePower: POWRUP1
|
||||
CashTickUp: CASHTIK1
|
||||
CashTickDown: CASHTIK1
|
||||
LevelUp: SCORTIK1
|
||||
|
||||
@@ -23,27 +23,34 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Font: Bold
|
||||
Label@LABEL_LOBBY_FACTION:
|
||||
X: 270
|
||||
Width: 130
|
||||
Width: 140
|
||||
Height: 25
|
||||
Text: Faction
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@LABEL_LOBBY_TEAM:
|
||||
X: 410
|
||||
X: 420
|
||||
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: 468
|
||||
X: 560
|
||||
Width: 48
|
||||
Height: 25
|
||||
Text: Spawn
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Label@LABEL_LOBBY_STATUS:
|
||||
X: 525
|
||||
X: 617
|
||||
Width: 20
|
||||
Height: 25
|
||||
Text: Ready
|
||||
@@ -118,7 +125,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: PARENT_BOTTOM - 12
|
||||
DropDownButton@FACTION:
|
||||
X: 270
|
||||
Width: 130
|
||||
Width: 140
|
||||
Height: 25
|
||||
IgnoreChildMouseOver: true
|
||||
TooltipContainer: TOOLTIP_CONTAINER
|
||||
@@ -135,23 +142,29 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: 25
|
||||
Text: Faction
|
||||
DropDownButton@TEAM_DROPDOWN:
|
||||
X: 410
|
||||
X: 420
|
||||
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: 468
|
||||
X: 560
|
||||
Width: 48
|
||||
Height: 25
|
||||
Text: Spawn
|
||||
Checkbox@STATUS_CHECKBOX:
|
||||
X: 525
|
||||
X: 617
|
||||
Y: 2
|
||||
Width: 20
|
||||
Height: 20
|
||||
Visible: false
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 619
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -225,7 +238,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: 13
|
||||
Container@FACTION:
|
||||
X: 270
|
||||
Width: 160
|
||||
Width: 170
|
||||
Height: 25
|
||||
Children:
|
||||
Image@FACTIONFLAG:
|
||||
@@ -235,32 +248,43 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Height: 23
|
||||
Label@FACTIONNAME:
|
||||
X: 34
|
||||
Width: 60
|
||||
Width: 70
|
||||
Height: 25
|
||||
Text: Faction
|
||||
Label@TEAM:
|
||||
X: 410
|
||||
X: 420
|
||||
Width: 23
|
||||
Height: 25
|
||||
Align: Center
|
||||
Text: Team
|
||||
Label@SPAWN:
|
||||
X: 468
|
||||
Width: 23
|
||||
Height: 25
|
||||
Align: Center
|
||||
DropDownButton@TEAM_DROPDOWN:
|
||||
X: 410
|
||||
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
|
||||
Width: 23
|
||||
Height: 25
|
||||
Align: Center
|
||||
DropDownButton@SPAWN_DROPDOWN:
|
||||
X: 468
|
||||
X: 560
|
||||
Width: 48
|
||||
Height: 25
|
||||
Visible: false
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 619
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -286,7 +310,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Visible: false
|
||||
Button@JOIN:
|
||||
X: 190
|
||||
Width: 326
|
||||
Width: 418
|
||||
Height: 25
|
||||
Text: Play in this slot
|
||||
Container@TEMPLATE_EDITABLE_SPECTATOR:
|
||||
@@ -333,19 +357,19 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Template: ANONYMOUS_PLAYER_TOOLTIP
|
||||
Label@SPECTATOR:
|
||||
X: 190
|
||||
Width: 326
|
||||
Width: 418
|
||||
Height: 25
|
||||
Text: Spectator
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Checkbox@STATUS_CHECKBOX:
|
||||
X: 525
|
||||
X: 617
|
||||
Y: 2
|
||||
Width: 20
|
||||
Height: 20
|
||||
Visible: false
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 619
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -414,13 +438,13 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Template: ANONYMOUS_PLAYER_TOOLTIP
|
||||
Label@SPECTATOR:
|
||||
X: 190
|
||||
Width: 326
|
||||
Width: 418
|
||||
Height: 25
|
||||
Text: Spectator
|
||||
Align: Center
|
||||
Font: Bold
|
||||
Image@STATUS_IMAGE:
|
||||
X: 527
|
||||
X: 619
|
||||
Y: 4
|
||||
Width: 20
|
||||
Height: 20
|
||||
@@ -441,7 +465,7 @@ Container@LOBBY_PLAYER_BIN:
|
||||
Font: Regular
|
||||
Button@SPECTATE:
|
||||
X: 190
|
||||
Width: 326
|
||||
Width: 418
|
||||
Height: 25
|
||||
Text: Spectate
|
||||
Font: Regular
|
||||
|
||||
@@ -147,8 +147,10 @@ speed = 5
|
||||
Tick = function()
|
||||
ticks = ticks + 1
|
||||
|
||||
local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed;
|
||||
Camera.Position = viewportOrigin + WVec.New(19200 * math.sin(t), 28800 * math.cos(t), 0)
|
||||
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
|
||||
end
|
||||
|
||||
WorldLoaded = function()
|
||||
|
||||
@@ -249,7 +249,7 @@ ModContent:
|
||||
Required: true
|
||||
Download: patch106
|
||||
music: Game Music
|
||||
TestFiles: ^SupportDir|Content/d2k/v2/Music/AMBUSH.AUD
|
||||
TestFiles: ^SupportDir|Content/d2k/v2/Music/AMBUSH.AUD, ^SupportDir|Content/d2k/v2/Music/WAITGAME.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
|
||||
|
||||
@@ -184,10 +184,16 @@
|
||||
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:
|
||||
@@ -298,6 +304,7 @@
|
||||
Inherits@2: ^GainsExperience
|
||||
Inherits@3: ^SpriteActor
|
||||
Inherits@selection: ^SelectableCombatUnit
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Tooltip:
|
||||
GenericName: Unit
|
||||
Huntable:
|
||||
@@ -366,6 +373,7 @@
|
||||
^Plane:
|
||||
Inherits@1: ^ExistsInWorld
|
||||
Inherits@2: ^SpriteActor
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Interactable:
|
||||
Tooltip:
|
||||
GenericName: Unit
|
||||
@@ -391,6 +399,7 @@
|
||||
Inherits@1: ^ExistsInWorld
|
||||
Inherits@2: ^SpriteActor
|
||||
Inherits@selection: ^SelectableBuilding
|
||||
Inherits@handicaps: ^PlayerHandicaps
|
||||
Tooltip:
|
||||
GenericName: Structure
|
||||
Huntable:
|
||||
|
||||
@@ -39,6 +39,7 @@ Fremen_S:
|
||||
M_LMG:
|
||||
Inherits: ^MG
|
||||
ReloadDelay: 40
|
||||
ValidTargets: Infantry
|
||||
|
||||
M_LMG_H:
|
||||
Inherits: M_LMG
|
||||
@@ -49,6 +50,7 @@ M_HMG:
|
||||
ReloadDelay: 40
|
||||
Range: 3c512
|
||||
Report: 20MMGUN1.WAV
|
||||
InvalidTargets: Infantry
|
||||
Warhead@1Dam: SpreadDamage
|
||||
Damage: 2500
|
||||
Spread: 512
|
||||
|
||||
@@ -46,9 +46,9 @@ MedicVoice:
|
||||
|
||||
MechanicVoice:
|
||||
Voices:
|
||||
Select: mhuh1,mhowdy1,myes1,mrise1
|
||||
Move: mboss1,mhear1
|
||||
Action: mhotdig1,mwrench1
|
||||
Select: mhuh1,mhowdy1,mlaff1
|
||||
Move: mboss1,mhear1,myes1,mrise1
|
||||
Action: mhotdig1,mwrench1,myeehaw1
|
||||
Die: dedman1,dedman2,dedman3,dedman4,dedman5,dedman7,dedman8
|
||||
Burned: dedman10
|
||||
Zapped: dedman6
|
||||
@@ -117,8 +117,8 @@ EinsteinVoice:
|
||||
|
||||
ShokVoice:
|
||||
Voices:
|
||||
Select: jchrge1,jjuice1,jjump1,jpower1
|
||||
Move: jdance1,jyes1
|
||||
Select: jjuice1,jjump1,jyes1
|
||||
Move: jdance1,jchrge1,jpower1
|
||||
Attack: jburn1,jcrisp1,jshock1,jlight1
|
||||
Die: dedman1,dedman2,dedman3,dedman4,dedman5,dedman7,dedman8
|
||||
Burned: dedman10
|
||||
|
||||
@@ -320,7 +320,7 @@ dialog4:
|
||||
# completely black tile
|
||||
dialog5:
|
||||
Inherits: ^Dialog
|
||||
PanelRegion: 579, 387, 0, 0, 64, 64, 0, 0
|
||||
PanelRegion: 580, 388, 0, 0, 62, 62, 0, 0
|
||||
PanelSides: Center
|
||||
|
||||
lobby-bits:
|
||||
|
||||
@@ -329,7 +329,11 @@ InitTriggers = function()
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnKilled(SamBarrel, Sam1.Kill)
|
||||
Trigger.OnKilled(SamBarrel, function()
|
||||
if not Sam1.IsDead then
|
||||
Sam1.Kill()
|
||||
end
|
||||
end)
|
||||
|
||||
Trigger.OnAllKilled(SamSites, function()
|
||||
greece.MarkCompletedObjective(KillSams)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
PrisonColt:
|
||||
ValidTargets: Ground, GroundActor
|
||||
ReloadDelay: 5
|
||||
ReloadDelay: 7
|
||||
Report: gun5.aud
|
||||
Projectile: InstantHit
|
||||
Warhead@1Dam: SpreadDamage
|
||||
AffectsParent: true
|
||||
ValidTargets: Ground, GroundActor
|
||||
|
||||
@@ -73,16 +73,9 @@ SovietAirfields =
|
||||
SovietAirfield5, SovietAirfield6, SovietAirfield7, SovietAirfield8
|
||||
}
|
||||
|
||||
MountainEntry =
|
||||
{
|
||||
MountainEntry1.Location, MountainEntry2.Location, MountainEntry3.Location, MountainEntry4.Location,
|
||||
MountainEntry5.Location, MountainEntry6.Location, MountainEntry7.Location, MountainEntry8.Location
|
||||
}
|
||||
MountainEntry = { CPos.New(25, 45), CPos.New(25, 46), CPos.New(25, 47), CPos.New(25, 48), CPos.New(25, 49) }
|
||||
|
||||
BridgeEntry =
|
||||
{
|
||||
BridgeEntry1.Location, BridgeEntry2.Location, BridgeEntry3.Location, BridgeEntry4.Location
|
||||
}
|
||||
BridgeEntry = { CPos.New(25, 29), CPos.New(26, 29), CPos.New(27, 29), CPos.New(28, 29) }
|
||||
|
||||
MobileConstructionVehicle = { "mcv" }
|
||||
Yak = { "yak" }
|
||||
|
||||
Binary file not shown.
@@ -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,9 +871,6 @@ Actors:
|
||||
Actor6: gun
|
||||
Location: 28,44
|
||||
Owner: Allies
|
||||
Actor47: powr
|
||||
Location: 3,37
|
||||
Owner: Allies
|
||||
Actor45: 2tnk
|
||||
Location: 28,28
|
||||
Owner: Allies
|
||||
@@ -892,9 +889,6 @@ Actors:
|
||||
Actor40: e1
|
||||
Location: 24,30
|
||||
Owner: Allies
|
||||
Actor46: powr
|
||||
Location: 1,37
|
||||
Owner: Allies
|
||||
Actor49: fenc
|
||||
Location: 28,27
|
||||
Owner: Allies
|
||||
@@ -991,12 +985,6 @@ 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
|
||||
@@ -1390,44 +1378,8 @@ 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
|
||||
|
||||
@@ -24,8 +24,8 @@ Players:
|
||||
OwnsWorld: True
|
||||
NonCombatant: True
|
||||
Faction: allies
|
||||
PlayerReference@Greece:
|
||||
Name: Greece
|
||||
PlayerReference@England:
|
||||
Name: England
|
||||
Faction: allies
|
||||
Color: A0F08C
|
||||
Allies: GreekCivilians, Allies
|
||||
@@ -41,87 +41,87 @@ Players:
|
||||
Color: ABB7E4
|
||||
LockSpawn: True
|
||||
LockTeam: True
|
||||
Allies: Greece
|
||||
Allies: England
|
||||
Enemies: USSR, BadGuy
|
||||
PlayerReference@GreekCivilians:
|
||||
Name: GreekCivilians
|
||||
NonCombatant: True
|
||||
Faction: allies
|
||||
Allies: Greece
|
||||
Allies: England
|
||||
PlayerReference@USSR:
|
||||
Name: USSR
|
||||
Faction: soviet
|
||||
Color: FF1400
|
||||
Allies: BadGuy
|
||||
Enemies: Greece, GreekCivilians, Allies
|
||||
Enemies: England, GreekCivilians, Allies
|
||||
PlayerReference@BadGuy:
|
||||
Name: BadGuy
|
||||
Faction: soviet
|
||||
Color: FF1400
|
||||
Allies: USSR
|
||||
Enemies: Greece, GreekCivilians, Allies
|
||||
Enemies: England, GreekCivilians, Allies
|
||||
|
||||
Actors:
|
||||
Actor0: brik
|
||||
Location: 97,44
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor1: brik
|
||||
Location: 98,44
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor2: brik
|
||||
Location: 101,44
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor3: brik
|
||||
Location: 102,44
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor4: brik
|
||||
Location: 97,45
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor5: brik
|
||||
Location: 98,45
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor6: brik
|
||||
Location: 99,45
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor7: brik
|
||||
Location: 100,45
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor8: brik
|
||||
Location: 101,45
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor9: brik
|
||||
Location: 102,45
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor10: brik
|
||||
Location: 82,49
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor11: brik
|
||||
Location: 83,49
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor12: brik
|
||||
Location: 86,49
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor13: brik
|
||||
Location: 87,49
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor16: brik
|
||||
Location: 82,50
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor17: brik
|
||||
Location: 83,50
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor18: brik
|
||||
Location: 84,50
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor19: brik
|
||||
Location: 85,50
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor20: brik
|
||||
Location: 86,50
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor21: brik
|
||||
Location: 87,50
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor14: brik
|
||||
Location: 27,50
|
||||
Owner: USSR
|
||||
@@ -535,65 +535,65 @@ Actors:
|
||||
Owner: Neutral
|
||||
Actor391: flare
|
||||
Location: 81,41
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor157: apwr
|
||||
Location: 89,40
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor158: tent
|
||||
Location: 89,43
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor159: pbox
|
||||
Location: 88,50
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor160: pbox
|
||||
Location: 96,45
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor161: gun
|
||||
Location: 92,47
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Facing: 636
|
||||
Actor162: v19
|
||||
Location: 101,42
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor163: brl3
|
||||
Location: 102,41
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor164: brl3
|
||||
Location: 101,41
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor165: barl
|
||||
Location: 100,40
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor166: brl3
|
||||
Location: 99,39
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor167: barl
|
||||
Location: 98,39
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor168: v19
|
||||
Location: 97,39
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor169: brl3
|
||||
Location: 96,39
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor170: barl
|
||||
Location: 95,40
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor171: barl
|
||||
Location: 102,43
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor172: brl3
|
||||
Location: 100,44
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor173: brl3
|
||||
Location: 97,40
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor174: brl3
|
||||
Location: 98,40
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor175: barl
|
||||
Location: 102,42
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Church: v01
|
||||
Location: 93,70
|
||||
Owner: GreekCivilians
|
||||
@@ -656,16 +656,16 @@ Actors:
|
||||
Owner: USSR
|
||||
Actor193: brl3
|
||||
Location: 99,43
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor194: barl
|
||||
Location: 98,43
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
CivBarrel: barl
|
||||
Location: 94,40
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor196: brl3
|
||||
Location: 101,43
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
SovFact: fact
|
||||
Location: 31,59
|
||||
Owner: USSR
|
||||
@@ -734,16 +734,16 @@ Actors:
|
||||
Owner: USSR
|
||||
Actor218: apwr
|
||||
Location: 80,46
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor219: dome
|
||||
Location: 84,47
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
BridgeBarrel1: brl3
|
||||
Location: 85,42
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor221: barl
|
||||
Location: 85,41
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
Actor222: v19
|
||||
Location: 68,57
|
||||
Owner: Neutral
|
||||
@@ -882,7 +882,7 @@ Actors:
|
||||
Facing: 508
|
||||
FlareBoy: e1
|
||||
Location: 75,87
|
||||
Owner: Greece
|
||||
Owner: England
|
||||
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, rules.yaml
|
||||
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml
|
||||
|
||||
Weapons: weapons.yaml
|
||||
|
||||
@@ -59,7 +59,7 @@ MissionStart = function()
|
||||
FlareBoy.Move(LightFlare.Location)
|
||||
|
||||
Trigger.OnEnteredFootprint({ LightFlare.Location }, function(actor, id)
|
||||
if actor.Owner == Greece then
|
||||
if actor.Owner == England 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(Greece, ExtractionHelicopterType, nil, DoomedHeliPath)[1]
|
||||
DoomedHeli = Reinforcements.ReinforceWithTransport(England, 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 = Greece, Location = GuideSpawn.Location })
|
||||
local guide = Actor.Create("c6", true, { Owner = England, 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(Greece, CivilianSquad1, { CivFlee1.Location, CivilianRally.Location }, 0)
|
||||
Reinforcements.Reinforce(Greece, CivilianSquad2, { CivFlee2.Location, CivilianRally.Location }, 0)
|
||||
Reinforcements.Reinforce(England, CivilianSquad1, { CivFlee1.Location, CivilianRally.Location }, 0)
|
||||
Reinforcements.Reinforce(England, 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(Greece, TentTeam, { Tent.Location, TentMove.Location }, 0)
|
||||
local defenders = Reinforcements.Reinforce(England, 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(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)
|
||||
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)
|
||||
end)
|
||||
|
||||
Trigger.AfterDelay(DateTime.Seconds(15), function()
|
||||
@@ -404,7 +404,7 @@ end
|
||||
|
||||
ChurchAttack = function()
|
||||
if not ChurchDamaged then
|
||||
local churchPanicTeam = Reinforcements.Reinforce(Greece, CivilianSquad1, { ChurchSpawn.Location }, 0)
|
||||
local churchPanicTeam = Reinforcements.Reinforce(England, 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")
|
||||
Greece = Player.GetPlayer("Greece")
|
||||
England = Player.GetPlayer("England")
|
||||
Civilians = Player.GetPlayer("GreekCivilians")
|
||||
|
||||
Trigger.OnObjectiveAdded(Allies, function(p, id)
|
||||
|
||||
@@ -121,7 +121,11 @@ SendAlliedUnits = function()
|
||||
if unit.Type == "e6" then
|
||||
Engineer = unit
|
||||
Trigger.OnKilled(unit, LandingPossible)
|
||||
end
|
||||
elseif unit.Type == "thf" then
|
||||
Trigger.OnKilled(unit, function()
|
||||
player.MarkFailedObjective(StealMoney)
|
||||
end)
|
||||
end
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
@@ -297,6 +301,7 @@ 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.")
|
||||
@@ -377,6 +382,17 @@ 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
|
||||
|
||||
@@ -26,9 +26,6 @@ World:
|
||||
Explodes:
|
||||
Weapon: BarrelExplode
|
||||
EmptyWeapon: BarrelExplode
|
||||
-SpawnActorOnDeath@1:
|
||||
-SpawnActorOnDeath@2:
|
||||
-SpawnActorOnDeath@3:
|
||||
|
||||
V01.exploding:
|
||||
Inherits: ^ExplodingCivBuilding
|
||||
|
||||
BIN
mods/ra/maps/oil-spill/map.bin
Normal file
BIN
mods/ra/maps/oil-spill/map.bin
Normal file
Binary file not shown.
BIN
mods/ra/maps/oil-spill/map.png
Normal file
BIN
mods/ra/maps/oil-spill/map.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
309
mods/ra/maps/oil-spill/map.yaml
Normal file
309
mods/ra/maps/oil-spill/map.yaml
Normal file
@@ -0,0 +1,309 @@
|
||||
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
|
||||
27
mods/ra/maps/oil-spill/oil-spill.lua
Normal file
27
mods/ra/maps/oil-spill/oil-spill.lua
Normal file
@@ -0,0 +1,27 @@
|
||||
--[[
|
||||
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
|
||||
215
mods/ra/maps/oil-spill/rules.yaml
Normal file
215
mods/ra/maps/oil-spill/rules.yaml
Normal file
@@ -0,0 +1,215 @@
|
||||
World:
|
||||
LuaScript:
|
||||
Scripts: oil-spill.lua
|
||||
SpawnMPUnits:
|
||||
DropdownVisible: False
|
||||
MPStartUnits@mcvonly:
|
||||
BaseActor: fcom
|
||||
|
||||
FCOM:
|
||||
MustBeDestroyed:
|
||||
RequiredForShortGame: true
|
||||
Power:
|
||||
Amount: 50
|
||||
Health:
|
||||
HP: 110000
|
||||
Production:
|
||||
Produces: Building, Defense
|
||||
RepairableBuilding:
|
||||
RepairStep: 700
|
||||
PlayerExperience: 25
|
||||
RepairingNotification: Repairing
|
||||
WithBuildingRepairDecoration:
|
||||
Image: allyrepair
|
||||
Sequence: repair
|
||||
Position: Center
|
||||
Palette: player
|
||||
IsPlayerPalette: True
|
||||
ProductionBar@Building:
|
||||
ProductionType: Building
|
||||
ProductionBar@Defense:
|
||||
ProductionType: Defense
|
||||
Color: 8A8A8A
|
||||
BaseBuilding:
|
||||
ProvidesPrerequisite@buildingname:
|
||||
|
||||
OILB:
|
||||
CashTrickler:
|
||||
Interval: 250
|
||||
Amount: 100
|
||||
SpawnActorOnDeath:
|
||||
Actor: OILB.Husk
|
||||
OwnerType: InternalName
|
||||
|
||||
OILB.Husk:
|
||||
Inherits: ^TechBuilding
|
||||
Inherits@shape: ^2x2Shape
|
||||
Selectable:
|
||||
Priority: 0
|
||||
Bounds: 48,48
|
||||
CapturableProgressBar:
|
||||
CapturableProgressBlink:
|
||||
Building:
|
||||
Footprint: xx xx
|
||||
Dimensions: 2,2
|
||||
Tooltip:
|
||||
Name: Husk (Oil Derrick)
|
||||
CaptureManager:
|
||||
Capturable:
|
||||
Types: building-husk
|
||||
TransformOnCapture:
|
||||
IntoActor: OILB
|
||||
ForceHealthPercentage: 50
|
||||
Targetable:
|
||||
TargetTypes: building-husk
|
||||
|
||||
E6:
|
||||
Captures@husk:
|
||||
RequiresCondition: !global-reusable-engineers
|
||||
CaptureTypes: building-husk
|
||||
PlayerExperience: 25
|
||||
CaptureDelay: 200
|
||||
EnterCursor: goldwrench
|
||||
Captures@husk-reusable:
|
||||
RequiresCondition: global-reusable-engineers
|
||||
CaptureTypes: building-husk
|
||||
PlayerExperience: 25
|
||||
CaptureDelay: 375
|
||||
EnterCursor: goldwrench
|
||||
ConsumedByCapture: False
|
||||
|
||||
WEAP:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
|
||||
PROC:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
|
||||
SILO:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
|
||||
BRIK:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
|
||||
POWR:
|
||||
Power:
|
||||
Amount: 125
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
|
||||
APWR:
|
||||
Power:
|
||||
Amount: 250
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
|
||||
TENT:
|
||||
Buildable:
|
||||
Prerequisites: fcom
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
|
||||
DOME:
|
||||
Buildable:
|
||||
Prerequisites: anypower
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
|
||||
SYRD:
|
||||
Buildable:
|
||||
Prerequisites: fcom
|
||||
-MustBeDestroyed:
|
||||
|
||||
SPEN:
|
||||
Buildable:
|
||||
Prerequisites: fcom
|
||||
-MustBeDestroyed:
|
||||
|
||||
STEK:
|
||||
Buildable:
|
||||
Prerequisites: dome, tent
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
|
||||
AFLD:
|
||||
Buildable:
|
||||
Prerequisites: dome
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
AirstrikePower@spyplane:
|
||||
Prerequisites: afld
|
||||
AirstrikePower@parabombs:
|
||||
Prerequisites: afld
|
||||
|
||||
HPAD:
|
||||
Buildable:
|
||||
Prerequisites: dome
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
|
||||
FIX:
|
||||
Buildable:
|
||||
Prerequisites: dome
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
|
||||
IRON:
|
||||
Buildable:
|
||||
Prerequisites: stek
|
||||
|
||||
PDOX:
|
||||
Buildable:
|
||||
Prerequisites: atek
|
||||
ChronoshiftPower@chronoshift:
|
||||
-Prerequisites:
|
||||
-ChronoshiftPower@advancedchronoshift:
|
||||
|
||||
ATEK:
|
||||
Buildable:
|
||||
Prerequisites: dome, tent
|
||||
-SpawnActorsOnSell:
|
||||
-MustBeDestroyed:
|
||||
|
||||
FTUR:
|
||||
Buildable:
|
||||
Prerequisites: tent
|
||||
-SpawnActorsOnSell:
|
||||
|
||||
GUN:
|
||||
Buildable:
|
||||
Prerequisites: tent
|
||||
-SpawnActorsOnSell:
|
||||
|
||||
GAP:
|
||||
Buildable:
|
||||
Prerequisites: atek
|
||||
-SpawnActorsOnSell:
|
||||
|
||||
AGUN:
|
||||
Buildable:
|
||||
Prerequisites: dome
|
||||
-SpawnActorsOnSell:
|
||||
|
||||
TSLA:
|
||||
Buildable:
|
||||
Prerequisites: dome
|
||||
-SpawnActorsOnSell:
|
||||
|
||||
MECH:
|
||||
Buildable:
|
||||
Prerequisites: dome
|
||||
|
||||
E1:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
|
||||
E3:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
|
||||
E7:
|
||||
Buildable:
|
||||
Prerequisites: ~disabled
|
||||
4
mods/ra/maps/oil-spill/sequences.yaml
Normal file
4
mods/ra/maps/oil-spill/sequences.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
oilb.husk: oilb
|
||||
idle: oilb
|
||||
Start: 1
|
||||
Offset: 0,-6
|
||||
@@ -647,4 +647,4 @@ Actors:
|
||||
Location: 66,43
|
||||
Owner: Neutral
|
||||
|
||||
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, rules.yaml
|
||||
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml
|
||||
|
||||
@@ -113,7 +113,7 @@ ConsoleTriggers = function()
|
||||
Trigger.AfterDelay(DateTime.Seconds(4), function()
|
||||
Utils.Do(SarinVictims, function(actor)
|
||||
if not actor.IsDead then
|
||||
actor.Kill()
|
||||
actor.Kill("ExplosionDeath")
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user