Compare commits

...

84 Commits

Author SHA1 Message Date
Unrud
b278a63e11 Makefile: Fail target version when not a git repository 2021-03-13 15:58:11 +00:00
Paul Chote
7ba140e471 Fail Situation Critical if Volkov is killed before entering the world. 2021-03-13 15:55:39 +00:00
Paul Chote
df476dd96f Fix non-relative path handling in install logic. 2021-03-13 15:52:52 +00:00
Paul Chote
f813f2bd46 Fix lobby checkbox event rectangle overlapping with scrollbars. 2021-03-05 18:56:46 +01:00
Paul Chote
c9c24490e6 Fix rendering artifacts with RA's dialog5 background. 2021-03-05 18:36:08 +01:00
penev92
11d84041d9 Added the "missing" song to the D2k TestFiles
Since it's music it's optional, so the players still won't know anything happened, but if they do open the content manager they will have a chance for an automatic installation.
2021-02-28 12:29:27 +00:00
pizzaoverhead
7ec9bdf0d0 Fix TLS error on Win7. 2021-02-28 10:15:52 +00:00
penev92
ef59b07a2d Fixed D2k VQA videos crashing the game 2021-02-19 13:38:23 +01:00
Unrud
74e3ded764 AppStream Metadata: Add violence-worship: moderate 2021-02-14 14:17:22 +00:00
Unrud
a46fab4ece Update AppStream metadata for linux packaging
A few small improvements:
* The type `desktop` was renamed to `desktop-appliaction` (a long time ago)
* Add `launchable` to tell how the application can be launched
* Use `https` for homepage link
* Add link to the bugtracker
* Update `oars-1.0` to `oars-1.1`
* Remove all unnecessary `content_attribute` entries with value `none`
2021-02-14 14:17:16 +00:00
Smittytron
81a7c3446d Add clarifying objective to Monster Tank Madness 2021-02-12 02:35:42 +01:00
Orb
a3404fac66 APC Balance Tweak Commit 2021-02-09 23:08:55 +01:00
Paul Chote
bb2276498b Fix Tanya's prone firing animations. 2021-02-02 23:06:27 +01:00
Unrud
7367b546e8 Use version from VERSION file
The `VERSION` variable doesn't work with a release tarball, because it requires git to be set correctly.
Instead this reads the version from the `VERSION` file.
2021-02-01 23:14:12 +01:00
abcdefg30
becc180956 Increase the reload delay of the prison colt to match the normal colt 2021-01-31 22:36:16 +00:00
abcdefg30
656ce35330 Fix the gun sounds not playing in Allies05a 2021-01-31 22:36:13 +00:00
Smittytron
2575b41492 Fix crash in Allies 05a on SamBarrel kill 2021-01-31 18:53:02 +01:00
abcdefg30
acaf535b67 Remove the 'docs' target from the windows make file 2021-01-30 21:08:59 +00:00
Paul Chote
503a434a4b Fix Concrete placement on invalid terrain. 2021-01-30 14:48:35 +01:00
Smittytron
e27c093536 Remove SpawnActorOnDeath from civilian structures 2021-01-30 13:50:20 +01:00
Paul Chote
fed7daa03d Ignore invalid server entries instead of the entire list. 2021-01-30 13:46:22 +01:00
Paul Chote
3906c6efab Don't crash if a null uid is given to QueryRemoteMapDetails. 2021-01-30 13:46:20 +01:00
Paul Chote
ae018235d0 Prevent AttackPopupTurreted.TickIdle from running while disabled. 2021-01-30 13:16:45 +01:00
Paul Chote
a8f6256c04 Restore missing versioned source code package. 2021-01-30 13:05:54 +01:00
reaperrr
de6a9dc8da Fix RA inf death anims playing too fast 2021-01-30 01:24:03 +00:00
Paul Chote
f14e3669e3 Fix Tanya firing animation. 2021-01-29 15:03:37 +01:00
Paul Chote
21eb585a28 Support burst-specific infantry attack animations. 2021-01-29 15:03:24 +01:00
Paul Chote
f8dddf0502 Reduce Tanya firing rate. 2021-01-29 15:03:13 +01:00
Paul Chote
d3482c0f18 Suppress error messages from make.ps1 clean.
Also removed obsolete ./*/bin removal.
2021-01-29 14:54:15 +01:00
Paul Chote
d1c9b8d30f Keep Discord join button active for spectators. 2021-01-29 14:39:53 +01:00
Paul Chote
d2a6b7370e Remove first-client check from LobbySettingsNotification.
ClientWithIndex may rarely be null, causing a crash.
In any case we do want to report these changes to the first client, as
somebody else may have changed the settings and left.
2021-01-29 14:33:56 +01:00
Paul Chote
20b55ab5db Fix bot-controlled aircraft stalling above cloaked targets. 2021-01-29 14:30:00 +01:00
Paul Chote
c7ffc4d24f Increase map chooser dialog size to match the lobby. 2021-01-25 20:44:05 +01:00
Smittytron
2ce83bb51f Change hospital owner in Nod07b 2021-01-24 10:52:52 +00:00
teinarss
ea9f967acd Add Map and server name to discord details 2021-01-22 14:14:27 +01:00
Paul Chote
4a6927b513 Fix AutoTarget.ChooseTarget ignoring AttackBase.TargetFrozenActors. 2021-01-21 19:25:25 +01:00
Paul Chote
cab611b8dd Fix make check ignoring TARGETPLATFORM override. 2021-01-19 09:34:45 +01:00
Paul Chote
47bfa8bce8 Fix Sardarkaur not attacking while attack-moving. 2021-01-17 19:45:06 +01:00
Matthias Mailänder
40c452b07e Update path according to latest appstream specifications. 2021-01-16 20:04:15 +01:00
Matthias Mailänder
f1b238d7bf Document the target platform parameter during install
as it otherwise copies the system binaries.
2021-01-16 20:04:13 +01:00
Matthias Mailänder
0028a26193 Get rid of unnecessary Makefile variables. 2021-01-16 20:04:12 +01:00
Matthias Mailänder
bcdbd02f1c Don't contain the build root in the wrappers. 2021-01-16 20:04:10 +01:00
Matthias Mailänder
805fc5cade Create BIN_PATH first on shortcut installation. 2021-01-16 20:04:09 +01:00
VonNah
90ddbbc934 Fix vehicle explosion and missile impact sounds in Tiberian Dawn 2021-01-16 01:32:34 +00:00
VonNah
5f9126f274 Fixed an issue where RadarUp and DisablePower/EnablePower use the wrong sound effects.
Signed-off-by: VonNah <vonnahora@gmail.com>
2021-01-16 00:48:58 +00:00
Paul Chote
a1011efd98 Update apt metadata before installing dependencies. 2021-01-12 23:11:20 +01:00
Paul Chote
135ee781d4 Fix infantry freezing death animations in Top o' the World mission. 2021-01-11 11:32:50 +01:00
Paul Chote
56ef43145b Fix Grenadier death animation in Sarin Gas 3 mission. 2021-01-11 11:32:49 +01:00
Paul Chote
ff1bfe162b Add death types support to the Lua Kill() API. 2021-01-11 11:32:47 +01:00
Paul Chote
c642162d55 Cancel support power targeting if power cannot be activated. 2021-01-10 22:43:41 +01:00
Paul Chote
4bec1d1950 Add a per-player handicap option to the lobby.
Handicaps reduce unit health, firepower, and build speed.
2021-01-10 22:23:08 +01:00
Paul Chote
e769f51169 Increase lobby and server list width. 2021-01-10 22:22:56 +01:00
Paul Chote
ee19990749 Switch make.ps1 to downloading from our GeoIP data mirror. 2021-01-10 21:13:18 +01:00
Matthias Mailänder
0eefb0bc8c Fix syntax errors. 2021-01-10 21:10:21 +01:00
Matthias Mailänder
dd10b52955 Use the GitHub action variable for clickable links. 2021-01-10 21:10:19 +01:00
Matthias Mailänder
9a8b5da727 Update SDL 2 nuget package to match the platform. 2021-01-10 21:04:21 +01:00
Smittytron
53fe004c01 Add Aftermath mission Shock Therapy 2021-01-10 02:35:30 +01:00
Paul Chote
eea0ca1a4e Avoid BuildUnit crash if the item is invalidated before the task runs. 2021-01-10 01:34:26 +01:00
Paul Chote
ccbc78ea98 Add a setting to pause the shellmap. 2021-01-10 00:24:39 +01:00
Paul Chote
befcbe3677 Group bot AttackMove orders. 2021-01-09 23:56:18 +01:00
Orb
1f48359899 Playtest-Balance-Tweaks Commit 2021-01-09 23:23:21 +01:00
Matthias Mailänder
c4aed8af3f Fix error NU1101: Unable to find package. 2021-01-03 14:09:57 +01:00
Paul Chote
2d30913f06 Disable AttackPopupTurreted state changes when paused. 2021-01-03 12:47:03 +01:00
nvrnight
e3c96cf283 Issue #18936: The game no longer crashes when TextFieldWidget sends Enter key press and onSelect action is null. 2021-01-03 12:28:24 +01:00
Smittytron
325f414d45 Fix palettes in Fall of Greece 1 2021-01-02 22:46:19 +01:00
Smittytron
4371fb058b Add campaign-palettes to missions lacking it 2021-01-02 22:46:11 +01:00
Paul Chote
1d3461f5da Fix exit priority ordering. 2021-01-02 15:42:38 +01:00
Paul Chote
271f2ce539 Start rally point lines at the spawn position instead of the exit cell. 2021-01-02 15:29:37 +01:00
Paul Chote
8c29a44795 Prevent Health: 100 from being added to actors. 2021-01-02 15:11:56 +01:00
Paul Chote
226b96f9b0 Add a friendly type name for Nullable<T>. 2021-01-02 11:39:34 +01:00
abcdefg30
fa75891f62 Explicitly return on failure in make.ps1 2020-12-30 17:33:29 +01:00
Ivaylo Draganov
9c4dd4a08a Update launch.json to work with the new launcher 2020-12-30 17:32:23 +01:00
Nah
a75de2dd8b Update defaults.yaml
Fix the Building's SoundOnDamageTransition DamagedSounds with the correct one and add a second sound file to DestroyedSounds for more variation like in the original Tiberian Dawn.
2020-12-30 14:07:16 +00:00
abcdefg30
5249841ab7 Move myes1 and mrise1 from Select to Move Mechanic Voices 2020-12-30 02:01:21 +00:00
abcdefg30
01204eb414 Enable mechanic voices from Aftermath 2020-12-30 02:01:17 +00:00
Smittytron
58e86d1499 Remove out of bounds actors from Exodus 2020-12-30 01:51:55 +00:00
Smittytron
3b3c6a6647 Fix lag issue on Exodus by narrowing exit area 2020-12-30 01:51:48 +00:00
abcdefg30
31c6e3826e Correct Shock Trooper Move and Select voices 2020-12-29 21:15:42 +01:00
Orb
14f5c9d228 Fix-MT-Sound-Commit 2020-12-28 10:57:25 +01:00
Paul Chote
97d165ed94 Fix an incorrect comment in install_assemblies_mono 2020-12-24 12:11:20 +01:00
abcdefg30
d6c9bedd5a Add the 9th Dark Tournament map as "Oil Spill" 2020-12-21 21:14:17 +01:00
Paul Chote
00bc08e9a8 Fix api output directory. 2020-12-14 18:36:23 +01:00
Paul Chote
924cf4a885 Fix docs.openra.net repository reference. 2020-12-14 18:36:15 +01:00
Paul Chote
1f7eef8ffc Fix docs.openra.net documentation workflow. 2020-12-13 16:24:41 +00:00
120 changed files with 3158 additions and 621 deletions

View File

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

View File

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

View File

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

View File

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

@@ -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",
},
]

View File

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

View File

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

View File

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

View File

@@ -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 = { };

View File

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

View File

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

View File

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

View File

@@ -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,
};

View File

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

View File

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

View File

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

View File

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

View File

@@ -174,7 +174,7 @@ namespace OpenRA.Mods.Cnc.Traits
protected override void Tick(World world)
{
// Cancel the OG if we can't use the power
if (!manager.Powers.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();
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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);
}
}
}

View File

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

View File

@@ -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,
};

View File

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

View File

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

View File

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

View File

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

View File

@@ -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) { }

View File

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

View File

@@ -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);
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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) { }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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();
}

View File

@@ -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");

View File

@@ -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");

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -33,7 +33,7 @@ FlametankExplode:
DamageTypes: Prone50Percent, TriggerProne, FireDeath
Warhead@2Eff: CreateEffect
Explosions: big_napalm
ImpactSounds: 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -51,17 +51,17 @@ Players:
Enemies: Soviets
PlayerReference@Allies:
Name: Allies
Bot: campaign
Faction: allies
Color: 5CC1A3
Allies: Allies1, Allies2
Enemies: Soviets
Bot: campaign
PlayerReference@Soviets:
Name: Soviets
Bot: campaign
Faction: soviet
Color: FE1100
Enemies: Allies1, Allies2
Bot: campaign
Actors:
Actor239: dog
@@ -871,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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View 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

View 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

View 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

View File

@@ -0,0 +1,4 @@
oilb.husk: oilb
idle: oilb
Start: 1
Offset: 0,-6

View File

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

View File

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