-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Negotiations mission (Red Alert, scg47ea) #20975
Conversation
I think this can be reversed. If anything we would like to give chinook to both factions like in vanilla |
I think the flare next to the general can extinguish after he's been killed, maybe a few minutes death timer? It feels a bit off when it's permanent. Also the camera on the demo truck should be triggered from the other side of the fence. I've also noticed that if you don't blow up the demo while on the other side of the fence, it's a big struggle to keep the civilians alive I'm also a bit stumped, if you get into this situation how do you proceed? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ah I understand, but it's almost impossible to win as civilians will get themselves killed very quickly onto the infantry and flame tower
How long should that be? I know from fiddling with Don't Drink The Water that the original flares seem to expire after 8m but I'm guessing that'd be too long.
It can be, though in that case, you probably have barrels for the village patrol. They move clockwise and the dog especially should be easy to burn. The demo truck camera should already spawn at the truck's death location unless it's attacking or I've goofed and this trigger only does it at its starting location. Trigger.OnKilled(SovietDemoTruck, function()
if not SovietDemoTruck.IsIdle then
return
end
SpawnPlayerCamera(SovietDemoTruck.Location, DateTime.Seconds(1), "camera.paradrop")
end)
The intended route seems to be returning to the forest. Once there, the tank and shock troopers at the river will move through, north toward the village bridge. You can use the same hideout on the east edge to wait them out, then proceed to the church. I'm a little irked to see them idle at the river crossing instead of the open church area, though. Odd. |
Yeah it spawns, I mean the camera revealing the barrels |
9bf5054
to
73fbb85
Compare
UpdateThe tank-guarding Shock Troopers are now Flamethrowers to reduce insta-deaths from fog.
Allies are back to using Badgers for all their infantry drops. Soviets use Chinooks and a handful of rocket launchers again.
The explosion reveals should feel more responsive. The money check for bot structure building is improved. The General's flare will expire 30 seconds after he does. Tanya's flare expires after 5 minutes. The timer now changes with difficulty.
The "Keep all hostages alive" objective is still required for Hard, but also appears on Normal or Easy as an optional objective.
The copyright notice is added. |
It's definitely easier with less shokies and with working patrols. Just the tiny cameras felt like there were enabled for too short. It's a blink it and you'll miss it Without reading the briefing it might be difficult to to tell from where to call in allied reinforcements. I'm not wether we need to fix it, but it's something worth thinking about |
73fbb85
to
95eab85
Compare
Small changes:
|
95eab85
to
04a45b5
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps create the "Signal for reinforcements" objective when it's actually possible to do. Instead of the ping the objective could just specify the location
Could delay the church objective as well, so there's less to read at the start of the mission. Ofc mission should still fail on blowing up the church.
When the timer ran out I got this crash
Actor 'c2 (dead)' does not define a property 'Kill'
04a45b5
to
4cbb295
Compare
Thank you. I can't figure how that re-kill may have happened without Tanya shooting the hostage, but that possibility was easy enough to test and the new check should handle any premature deaths.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should the tech centre be sold off upon the destruction of the command centre? Because it isn't
The mission is better now that there's less objective at the start, but you are still bombarded with text when you return the hostages to the church. I dunno how but it should be best to spread it out a bit more.
Signal flare detected could also be more specific. Perhaps flare detected in the west?
The church itself could also be highlighted somehow? I think it would be best to somehow highlight it upon saving the helpful civilian
I also really enjoyed the extra troops on hard difficulty. They made the mission feel more complete
|
perhaps change the objective to -Get hostages to church.
+Get hostages to town. and once you cross the river make the civilians go to church automatically? The helpful civilian already calls this place town |
4cbb295
to
d55af24
Compare
Took longer than expected, but some more changes got done. Made some vision tweaks so the church should be more obvious, and the church itself will provide vision until a hostage is loaded. The trigger ordering hostages to enter is extended to match that vision circle. Changed objectives so their messages are spaced out a bit, even the primary ones. Swapped the SignalFlare notification for SignalFlareWest. Two oddball crash scenarios are fixed.
The Guide will reroute if the bridge is out.
The northern edge team is moved a bit so they won't be partly obscured by the edge shroud. Blocker Team will correctly start moving south as the prison is revealed, rather than when the General retreats. BadGuy's units near the forward base will join in USSR's attack if it's destroyed. The Soviets can sell off their Tech Center when appropriate to speed up the end. Details:It will be sold after one of two events: the Forward Command is destroyed or the base built by BadGuy's reinforced MCV becomes useless. It's considered useless when that base is missing its Construction Yard, defenses, War Factory, and Barracks. Timelines I've considered and tested:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The mission plays really well, LGTM
d55af24
to
e5bd429
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like sublime work! Left a few comments which are mostly style nits.
local okay = Utils.Any(types, function(type) | ||
return BadGuy.HasPrerequisites( { type } ) | ||
end) | ||
|
||
return okay |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
local okay = Utils.Any(types, function(type) | |
return BadGuy.HasPrerequisites( { type } ) | |
end) | |
return okay | |
return Utils.Any(types, function(type) | |
return BadGuy.HasPrerequisites({ type }) | |
end) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oops. That was left behind when I removed the many, many debug messages.
end | ||
|
||
IsHarvesterNeeded = function(player) | ||
return player.HasPrerequisites( { "proc" } ) and #player.GetActorsByType("harv") < 1 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return player.HasPrerequisites( { "proc" } ) and #player.GetActorsByType("harv") < 1 | |
return player.HasPrerequisites({ "proc" }) and #player.GetActorsByType("harv") < 1 |
return false, "blocked" | ||
end | ||
|
||
local actor = Actor.Create(structure.type, true, { Owner = player, Location = structure.location } ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
local actor = Actor.Create(structure.type, true, { Owner = player, Location = structure.location } ) | |
local actor = Actor.Create(structure.type, true, { Owner = player, Location = structure.location }) |
|
||
LinkCooperativeObjectives = function() | ||
local greeceActor = Greece.GetActorsByType("player")[1] | ||
Trigger.Clear(greeceActor, "OnPlayerWon") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this needed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It has to do with the way objectives are set up to address #20975 (review) 's bit about objective message spam. The mission has points where this can happen:
- Greece completes a primary objective.
- Greece has completed all primary objectives, and is considered a winner. This triggers the OnPlayerWon added by InitObjectives from
campaign.lua
. - Mission completion isn't triggered because this is a co-op mission under the hood, and their ally England needs to also win.
- After a delay, Greece receives a new primary objective and the mission carries on.
At step 2, there would normally be the speech announcement "Mission accomplished." The options I saw were to remove the trigger from Greece, or put a rewritten InitObjectives into the mission. I figured the first option was less awkward. A little after this line, England's win hands Greece the normal announcement.
Ideally, I'd just set primary objectives at the start and delay showing/announcing them in a more straightforward way, but I realize that's a bit niche.
end | ||
-- Patrolling groups will need to halt. | ||
hunter.Stop() | ||
hunter.Hunt() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IdleHunt
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some of these will be groups using OnIdle to form up on a patrol location, wait until all live members of the group are there, then form up on the next location. An OnIdle clear followed by IdleHunt might be worth doing, though.
local guide = Actor.Create("c1", false, { Owner = GoodGuy, Location = GuideHouse.Location, SubCell = 4, Facing = Angle.South } ) | ||
|
||
Trigger.OnAddedToWorld(guide, function() | ||
GuideToForest(guide) | ||
end) | ||
|
||
Trigger.AfterDelay(15, function() | ||
if GuideHouse.IsDead then | ||
return | ||
end | ||
guide.IsInWorld = true | ||
end) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
local guide = Actor.Create("c1", false, { Owner = GoodGuy, Location = GuideHouse.Location, SubCell = 4, Facing = Angle.South } ) | |
Trigger.OnAddedToWorld(guide, function() | |
GuideToForest(guide) | |
end) | |
Trigger.AfterDelay(15, function() | |
if GuideHouse.IsDead then | |
return | |
end | |
guide.IsInWorld = true | |
end) | |
Trigger.AfterDelay(15, function() | |
if GuideHouse.IsDead then | |
return | |
end | |
local guide = Actor.Create("c1", true, { Owner = GoodGuy, Location = GuideHouse.Location, SubCell = 4, Facing = Angle.South }) | |
GuideToForest(guide) | |
end) |
return | ||
end | ||
|
||
if not (actor.Type == "e1" and guide.Location == GuideBarrelGoal.Location) then |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if not (actor.Type == "e1" and guide.Location == GuideBarrelGoal.Location) then | |
if actor.Type ~= "e1" or guide.Location ~= GuideBarrelGoal.Location then |
|
||
guide.Move(GuideBarrelGoal.Location) | ||
local revoked = false | ||
local revokeTargets = Utils.Where( { Executioner, PrisonBarrel1, PrisonBarrel2, PrisonBarrel3, PrisonBarrel4 }, IsAlive) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
local revokeTargets = Utils.Where( { Executioner, PrisonBarrel1, PrisonBarrel2, PrisonBarrel3, PrisonBarrel4 }, IsAlive) | |
local revokeTargets = Utils.Where({ Executioner, PrisonBarrel1, PrisonBarrel2, PrisonBarrel3, PrisonBarrel4 }, IsAlive) |
|
||
RemoveActor = function(actor, delay) | ||
Trigger.AfterDelay(delay or 0, function() | ||
if not (actor and actor.IsInWorld) then |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if not (actor and actor.IsInWorld) then | |
if not actor or not actor.IsInWorld then |
2ea9666
to
f74635a
Compare
4760956
to
55459ec
Compare
The last time I made changes, this got stalled for a while with a crash until #21076 fixed that. This is rebased now with other minor adjustments after rereading and retesting. Changes from September:(Where did the year go?) Changed Chrono Tanks to shift into the fight themselves. The dummy unit and its rules have been removed. Simplified some soldier reinforcements, along with the Guide's spawn. Simplified Hard dog reinforcements.There was some unnecessary code left from experiments with dogs in the village. Some dogs were created but not in the world until triggered, to avoid their early death from the demo truck explosion. Both dogs are now created normally at the start and given later orders with triggers.Style tweaks galore. Changes from today:Pointed map.yaml at the new(ish) Added a death check to the forest patrol's dog whine. Added some comments and renamed some things for clarity's sake. The Guide is extra forbidden from shooting barrels near the prison if the hostages are already free. He still had a chance to do this under certain circumstances:
The Guide is no longer too polite to infiltrate a friendly church. Dec 19: BadGuy's pause between structure (re)builds is a few seconds shorter. Feb 10: Rebased. Feb 24 Made the StartGameNotification change more graceful.
Fixed a pair of goofs where I forgot Added a death check to Fixed potential crashes for two unlikely events:
Added and tweaked some more comments. |
1a563c4
to
6f4af34
Compare
6f4af34
to
a769391
Compare
4b0ece7
to
083734a
Compare
On hard difficulty the first dog appear while tanya is still in air. On faster speeds its hard micro. Eats me little 10x. I would advice to delay dog at least for 1 sec. Otherwise looks good. Tested on all diffculties and game speeds. |
That seems reasonable. Funny story, I figured its early appearance would make things easier for two reasons:
Figuring anybody would know the first bit is a weird assumption on my part, and my concern with the second is likely overblown with how fast dogs move. It shouldn't be hard to adjust the timing. Does it sound okay if I keep the dog's appearance the same as a warning but delay the actual attack? |
sure |
083734a
to
080add5
Compare
Delayed the start dog's attack a bit. The timeline (at least as I logged it):
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
This adds Negotiations from Aftermath. It's a short mission featuring Tanya, some hostages in need of rescue, and many barrels in need of exploding.
Normal's more of a straight conversion. Thoughts on the Hard changes are welcome.
Feedback on the cameras would be dandy. The original relies on vision of old areas to avoid patrols, so cameras are used to give information when needed.
Design changes:
Original: A hostage must die before the group will follow Tanya.
New: All hostages can be saved.
Original: If he lives, the helpful Guide will either follow Tanya until the mission ends, or stand still near the hostage fencing.
New: He can be escorted back to the church like the other civilians.
Original: Soviets produce tanks as soon as a War Factory is up, including Tesla Tanks.
New: Soviets will build a Service Depot before producing tanks. They also start with a Soviet Tech Center, which can be destroyed to stop production of Tesla Tanks or Shock Troopers.
Original: The General will retreat to the northwestern beach when Tanya or the Guide come within ~7 cells. A Soviet MCV will arrive if the General's left alone.
New: The General is faster and the retreat is activated sooner. Reinforcements will come if the General stays for
45s-> 30s.entering the forest-> near the forest patrol's starting point.The MCV's arrival is revealed, and there's a notification for the General's flare.
Swapped some unit types around for convention's sake.
The Allied reinforcements come with 2 more mechanics.
Hard difficulty:
All hostages must survive.
Tanya will encounter more early resistance.
The return trip to the starting beach has some added enemies.
There is some more security around the prison and the BadGuy base area (where the MCV can deploy).
It's possible for Soviets to build Shock Troopers.
Notes on porting and such:
To mimic their original guard range, some dogs have a wider AutoTarget ScanRadius.
GuardRange=7
, 9 seemed to be a closer match.Guide's house is more vulnerable to damage, since ORA rifles do little to structures.
This western passage is originally passable, so I cleared a path. The eastern passage has a (narrow) path that works, so it was left untouched.
The Demolition Truck's explosion range is tightened, closer to the original's.
The Chrono Tank reinforcements' entry and triggers are slightly moved to avoid spawning inside other units.
The patrolling tank encountered during the rescue is guarded by two Shock Troopers, so it's fortunately still a threat to ORA Tanya.
The Guide's movement is more direct.
In case you're left to wonder why the Soviets' Demolition Truck goes hunting, that is the original
hunu
trigger.For funsies, hostages following Tanya will panic if she dies. Their disregard for personal space in RA '95 meant they were likely to do it there as well.