3 player map help

Hi, making 3 player map.. Need some help..

Information and discussion for custom maps and mods.
Post Reply
User avatar
zypres1
Posts: 276
Joined: Mon Oct 24, 2011 8:22 pm

3 player map help

Post by zypres1 »

Can I get help with:
  • Show playernames ingame
  • Fix so all players camera start on left side
  • Change pwr from fake
  • Limit to 3 helikopters at the same time
  • remove spy
  • Fix sam and rocketmen, so they will shoot at heli

Anything else? Feel free to copy and fix stuff..
Attachments
evacuation4.oramap
(54.82 KiB) Downloaded 454 times

User avatar
zypres1
Posts: 276
Joined: Mon Oct 24, 2011 8:22 pm

Re: 3 player map help

Post by zypres1 »

I also need some help on another map:

Cap mcv mission should be mission for allies1,
reusable engineers locked off,
team build should be on or selectable in lobby
And kill all should be winning condition, but cap hq should cancel airstrike

https://resource.openra.net/maps/33993/

User avatar
zypres1
Posts: 276
Joined: Mon Oct 24, 2011 8:22 pm

Re: 3 player map help

Post by zypres1 »

At least typing the different codes would help. (the whole thing with ends)
Or you can take over and make cool co-op games..

User avatar
zypres1
Posts: 276
Joined: Mon Oct 24, 2011 8:22 pm

Re: 3 player map help

Post by zypres1 »

Ok, some of the code, to make it easier to get help:

Code: Select all

--[[
   Copyright 2007-2019 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.
]]
DeathThreshold =
{
	easy = 200,
	normal = 100,
}

TanyaType = "e7"
if Map.LobbyOption("difficulty") ~= "easy" then
	TanyaType = "e7.noautotarget"
end

RepairTriggerThreshold =
{
	easy = 50,
	normal = 75,
}

Sams = { Sam1, Sam2, Sam3, Sam4 }
TownUnits =
{
	Einstein, Engineer,
	TownUnit01, TownUnit02, TownUnit03, TownUnit04, TownUnit05, TownUnit06, TownUnit07,
	TownUnit08, TownUnit09, TownUnit10, TownUnit11, TownUnit12, TownUnit13, TownUnit14,
}

ParabombDelay = DateTime.Seconds(30)
ParatroopersDelay = DateTime.Minutes(5)
Paratroopers =
{
	{
		proxy = "powerproxy.paras1",
		entry = BadgerEntryPoint1.Location,
		drop  = BadgerDropPoint1.Location,
	},
	{
		proxy = "powerproxy.paras2",
		entry = BadgerEntryPoint1.Location + CVec.New(3, 0),
		drop  = BadgerDropPoint2.Location,
	},
	{
		proxy = "powerproxy.paras2",
		entry = BadgerEntryPoint1.Location + CVec.New(6, 0),
		drop  = BadgerDropPoint3.Location,
	},
}

AttackGroup = { }
AttackGroupSize = 5
SovietInfantry = { "e1", "e2", "e3" }
SovietVehiclesUpgradeDelay = DateTime.Minutes(4)
SovietVehicleType = "Normal"
SovietVehicles =
{
	Normal = { "3tnk" },
	Upgraded = { "3tnk", "v2rl" },
}
ProductionInterval =
{
	easy = DateTime.Seconds(10),
	normal = DateTime.Seconds(2),
}

ReinforcementsDelay = DateTime.Minutes(16)
ReinforcementsUnits = { "2tnk", "2tnk", "2tnk", "2tnk", "2tnk", "2tnk", "1tnk", "1tnk", "jeep", "e1",
	"e1", "e1", "e1", "e3", "e3", "mcv", "truk", "truk", "truk", "truk", "truk", "truk" }

SpawnAlliedReinforcements = function()
	if allies2.IsLocalPlayer then
		UserInterface.SetMissionText("")
		Media.PlaySpeechNotification(allies2, "AlliedReinforcementsArrived")
	end
	Reinforcements.Reinforce(allies2, ReinforcementsUnits, { ReinforcementsEntryPoint.Location, Allies2BasePoint.Location })
end

Yak = nil
YakAttack = function()
	local targets = Map.ActorsInCircle(YakAttackPoint.CenterPosition, WDist.FromCells(10), function(a)
		return a.Owner == allies1 and not a.IsDead and a ~= Einstein and a ~= Tanya and a ~= Engineer and Yak.CanTarget(a)
	end)

	if (#targets > 0) then
		Yak.Attack(Utils.Random(targets))
	end
	Yak.Move(Map.ClosestEdgeCell(Yak.Location))
	Yak.Destroy()
	Trigger.OnRemovedFromWorld(Yak, function()
		Yak = nil
	end)
end

SovietTownAttack = function()
	local units = Utils.Shuffle(Utils.Where(Map.ActorsWithTag("TownAttacker"), function(a) return not a.IsDead end))

	Utils.Do(Utils.Take(5, units), function(unit)
		unit.AttackMove(TownPoint.Location)
		Trigger.OnIdle(unit, unit.Hunt)
	end)
end

SendParabombs = function()
	local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = soviets })
	proxy.SendAirstrikeFrom(BadgerEntryPoint2.Location, ParabombPoint1.Location)
	proxy.SendAirstrikeFrom(BadgerEntryPoint2.Location + CVec.New(0, 3), ParabombPoint2.Location)
	proxy.Destroy()
end

SendParatroopers = function()
	Utils.Do(Paratroopers, function(para)
		local proxy = Actor.Create(para.proxy, false, { Owner = soviets })
		local units = proxy.SendParatroopersFrom(para.entry, para.drop)
		proxy.Destroy()

		Utils.Do(units, function(unit)
			Trigger.OnIdle(unit, function(a)
				if a.IsInWorld then
					a.Hunt()
				end
			end)
		end)
	end)
end

SendAttackGroup = function()
	if #AttackGroup < AttackGroupSize then
		return
	end

	Utils.Do(AttackGroup, function(unit)
		if not unit.IsDead then
			Trigger.OnIdle(unit, unit.Hunt)
		end
	end)

	AttackGroup = { }
end

ProduceInfantry = function()
	if SovietBarracks.IsDead or SovietBarracks.Owner ~= soviets then
		return
	end

	soviets.Build({ Utils.Random(SovietInfantry) }, function(units)
		table.insert(AttackGroup, units[1])
		SendAttackGroup()
		Trigger.AfterDelay(ProductionInterval[Map.LobbyOption("difficulty")], ProduceInfantry)
	end)
end

ProduceVehicles = function()
	if SovietWarFactory.IsDead or SovietWarFactory.Owner ~= soviets then
		return
	end

	soviets.Build({ Utils.Random(SovietVehicles[SovietVehicleType]) }, function(units)
		table.insert(AttackGroup, units[1])
		SendAttackGroup()
		Trigger.AfterDelay(ProductionInterval[Map.LobbyOption("difficulty")], ProduceVehicles)
	end)
end

NumBaseBuildings = function()
	local buildings = Map.ActorsInBox(AlliedBaseTopLeft.CenterPosition, AlliedBaseBottomRight.CenterPosition, function(a)
		return not a.IsDead and a.Owner == allies2 and a.HasProperty("StartBuildingRepairs")
	end)

	return #buildings
end

Tick = function()
	if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 and NumBaseBuildings() == 0 then
		allies2.MarkFailedObjective(objHoldPosition)
	end

	if not allies2.IsObjectiveCompleted(objCutSovietPower) and soviets.PowerState ~= "Normal" then
		allies2.MarkCompletedObjective(objCutSovietPower)
	end

	if not allies2.IsObjectiveCompleted(objLimitLosses) and allies2.UnitsLost > DeathThreshold[Map.LobbyOption("difficulty")] then
		allies2.MarkFailedObjective(objLimitLosses)
	end

	if allies2.IsLocalPlayer and DateTime.GameTime <= ReinforcementsDelay then
		UserInterface.SetMissionText("Allied reinforcements arrive in " .. Utils.FormatTime(ReinforcementsDelay - DateTime.GameTime))
	else
		UserInterface.SetMissionText("")
	end
end

SetupSoviets = function()
	soviets.Cash = 1000

	if Map.LobbyOption("difficulty") == "easy" then
		Utils.Do(Sams, function(sam)
			local camera = Actor.Create("Camera.SAM", true, { Owner = allies1, Location = sam.Location })
			Trigger.OnKilledOrCaptured(sam, function()
				camera.Destroy()
			end)
		end)
	end

	local buildings = Utils.Where(Map.ActorsInWorld, function(self) return self.Owner == soviets and self.HasProperty("StartBuildingRepairs") end)
	Utils.Do(buildings, function(actor)
		Trigger.OnDamaged(actor, function(building)
			if building.Owner == soviets and building.Health < (building.MaxHealth * RepairTriggerThreshold[Map.LobbyOption("difficulty")] / 100) then
				building.StartBuildingRepairs()
			end
		end)
	end)

	SovietBarracks.IsPrimaryBuilding = true
	SovietBarracks.RallyPoint = SovietRallyPoint.Location
	SovietWarFactory.IsPrimaryBuilding = true
	SovietWarFactory.RallyPoint = SovietRallyPoint.Location

	Trigger.AfterDelay(SovietVehiclesUpgradeDelay, function() SovietVehicleType = "Upgraded" end)
	Trigger.AfterDelay(0, function()
		ProduceInfantry()
		ProduceVehicles()
	end)
end

SetupTriggers = function()
	Trigger.OnKilled(Tanya, function()
		allies1.MarkFailedObjective(objTanyaMustSurvive)
	end)

	Trigger.OnAllKilledOrCaptured(Sams, function()
		allies1.MarkCompletedObjective(objDestroySamSites)
		objExtractEinstein = allies1.AddPrimaryObjective("Wait for a helicopter at the LZ and extract Einstein.")
		Actor.Create("flare", true, { Owner = allies1, Location = ExtractionLZ.Location + CVec.New(1, -1) })
		Beacon.New(allies1, ExtractionLZ.CenterPosition)
		Media.PlaySpeechNotification(allies1, "SignalFlareNorth")

		ExtractionHeli = Reinforcements.ReinforceWithTransport(allies1, "tran", nil, { ExtractionLZEntryPoint.Location, ExtractionLZ.Location })[1]
		Trigger.OnKilled(ExtractionHeli, function()
			allies1.MarkFailedObjective(objExtractEinstein)
		end)
		Trigger.OnPassengerEntered(ExtractionHeli, function(heli, passenger)
			if passenger == Einstein then
				heli.Move(ExtractionLZEntryPoint.Location)
				heli.Destroy()
				Trigger.OnRemovedFromWorld(heli, function()
					allies2.MarkCompletedObjective(objLimitLosses)
					allies2.MarkCompletedObjective(objHoldPosition)
					allies1.MarkCompletedObjective(objTanyaMustSurvive)
					allies1.MarkCompletedObjective(objEinsteinSurvival)
					allies1.MarkCompletedObjective(objExtractEinstein)
				end)
			end
		end)
	end)

	Trigger.OnEnteredProximityTrigger(TownPoint.CenterPosition, WDist.FromCells(15), function(actor, trigger)
		if actor.Owner == allies1 then
			ReassignActors(TownUnits, neutral, allies1)
			Utils.Do(TownUnits, function(a) a.Stance = "Defend" end)
			allies1.MarkCompletedObjective(objFindEinstein)
			objEinsteinSurvival = allies1.AddPrimaryObjective("Keep Einstein alive at all costs.")
			Trigger.OnKilled(Einstein, function()
				allies1.MarkFailedObjective(objEinsteinSurvival)
			end)
			Trigger.RemoveProximityTrigger(trigger)
			SovietTownAttack()
		end
	end)

	Trigger.OnEnteredProximityTrigger(YakAttackPoint.CenterPosition, WDist.FromCells(5), function(actor, trigger)
		if not (Yak == nil or Yak.IsDead) or actor.Owner ~= allies1 then
			return
		end

		Yak = Actor.Create("yak", true, { Owner = soviets, Location = YakEntryPoint.Location, CenterPosition = YakEntryPoint.CenterPosition + WVec.New(0, 0, Actor.CruiseAltitude("yak")) })
		Yak.Move(YakAttackPoint.Location + CVec.New(0, -10))
		Yak.CallFunc(YakAttack)
	end)

	Trigger.AfterDelay(ParabombDelay, SendParabombs)
	Trigger.AfterDelay(ParatroopersDelay, SendParatroopers)
	Trigger.AfterDelay(ReinforcementsDelay, SpawnAlliedReinforcements)
end

SpawnTanya = function()
	Tanya = Actor.Create(TanyaType, true, { Owner = allies1, Location = TanyaLocation.Location })

	if Map.LobbyOption("difficulty") ~= "easy" and allies1.IsLocalPlayer then
		Trigger.AfterDelay(DateTime.Seconds(2), function()
			Media.DisplayMessage("According to the rules of engagement I need your explicit orders to fire, Commander! But I see more enemies than normal!", "Tanya")
		end)
	end
end

ReassignActors = function(actors, from, to)
	Utils.Do(actors, function(a)
		if a.Owner == from then
			a.Owner = to
			a.Stance = "Defend"
		end
	end)
end

WorldLoaded = function()
	neutral = Player.GetPlayer("Neutral")

	-- Allies is the pre-set owner of units that get assigned to either the second player, if any, or the first player otherwise.
	allies = Player.GetPlayer("Allies")

	-- Allies1 is the player starting on the right, controlling Tanya
	allies1 = Player.GetPlayer("Allies1")

	-- Allies2 is the player starting on the left, defending the base
	allies2 = Player.GetPlayer("Allies2")

	soviets = Player.GetPlayer("Soviets")

	Utils.Do({ allies1, allies2 }, function(player)
		if player and player.IsLocalPlayer then
			Trigger.OnObjectiveAdded(player, function(p, id)
				Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
			end)

			Trigger.OnObjectiveCompleted(player, function(p, id)
				Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
			end)

			Trigger.OnObjectiveFailed(player, function(p, id)
				Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
			end)

			Trigger.OnPlayerWon(player, function()
				Media.PlaySpeechNotification(player, "MissionAccomplished")
			end)

			Trigger.OnPlayerLost(player, function()
				Media.PlaySpeechNotification(player, "MissionFailed")
			end)
		end
	end)

	if not allies2 or allies2.IsLocalPlayer then
		Camera.Position = Allies2BasePoint.CenterPosition
	else
		Camera.Position = ChinookHusk.CenterPosition
	end

	if not allies2 then
		allies2 = allies1
	end

	ReassignActors(Map.ActorsInWorld, allies, allies2)
	SpawnTanya()

	objTanyaMustSurvive = allies1.AddPrimaryObjective("Tanya must survive.")
	objFindEinstein = allies1.AddPrimaryObjective("Find Einstein's crashed helicopter.")
	objDestroySamSites = allies1.AddPrimaryObjective("Destroy the SAM sites.")

	objHoldPosition = allies2.AddPrimaryObjective("Hold your position and protect the base.")
	objLimitLosses = allies2.AddSecondaryObjective("Do not lose more than " .. DeathThreshold[Map.LobbyOption("difficulty")] .. " units.")
	objCutSovietPower = allies2.AddSecondaryObjective("Take out the Soviet power grid.")

	SetupTriggers()
	SetupSoviets()
end
and:

Code: Select all

Player:
	MissionObjectives:
		Cooperative: True
	PlayerResources:
		DefaultCash: 4000

World:
	MissionData:
		Briefing: Testing out 3player version of evacuation on the same side. Dont use Tanya, just play together...
	LuaScript:
		Scripts: evacuation.lua
	ScriptLobbyDropdown@difficulty:
		ID: difficulty
		Label: Difficulty
		Values:
			easy: Easy
			normal: Normal
		Default: normal
	TimeLimitManager:
		TimeLimitLocked: True

^Palettes:
	IndexedPlayerPalette:
		PlayerIndex:
			Soviets: 229, 230, 231, 232, 233, 234, 235, 8, 236, 237, 238, 239, 221, 222, 223, 223
			Allies: 224, 224, 225, 225, 226, 184, 185, 186, 187, 188, 188, 189, 190, 190, 191, 191
			Allies1: 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175
			Allies2: 208, 208, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 143

E1:
	ScriptTags:

E2:
	ScriptTags:

DOG:
	ScriptTags:

3TNK:
	ScriptTags:

TRAN.Husk1:
	Burns:
		Damage: 0

TRAN.Husk2:
	Burns:
		Damage: 0

E7:
	Passenger:
		Weight: 0
	Buildable:
		Prerequisites: ~disabled

EINSTEIN:
	Passenger:
		Weight: 0

V01:
	SpawnActorOnDeath:
		Actor: healcrate

TRAN:
	-Selectable:
	Buildable:
		Prerequisites: ~disabled
	RevealsShroud:
		Range: 0c0
	Interactable:

2TNK:
	Buildable:
		Prerequisites: ~vehicles.allies

MECH:
	Buildable:
		Prerequisites: ~disabled

THF:
	Buildable:
		Prerequisites: ~disabled

SPEN:
	Buildable:
		Prerequisites: ~disabled

SYRD:
	Buildable:
		Prerequisites: ~disabled

TSLA:
	Buildable:
		Prerequisites: ~disabled

AGUN:
	Buildable:
		Prerequisites: ~disabled

SAM:
	Buildable:
		Prerequisites: ~disabled

ATEK:
	Buildable:
		Prerequisites: ~disabled

HPAD:
	Buildable:
		Prerequisites: ~disabled

AFLD:
	Buildable:
		Prerequisites: ~disabled

STEK:
	Buildable:
		Prerequisites: ~disabled

GAP:
	Buildable:
		Prerequisites: ~disabled

PDOX:
	Buildable:
		Prerequisites: ~disabled

IRON:
	Buildable:
		Prerequisites: ~disabled

MSLO:
	Buildable:
		Prerequisites: ~disabled

MIG:
	Buildable:
		Prerequisites: ~disabled

HELI:
	Buildable:
		Prerequisites: ~disabled

4TNK:
	Buildable:
		Prerequisites: ~disabled

MCV:
	Buildable:
		Prerequisites: ~disabled

ARTY:
	Buildable:
		Prerequisites: ~disabled

APC:
	Buildable:
		Prerequisites: ~disabled

MNLY:
	Buildable:
		Prerequisites: ~disabled

TRUK:
	Buildable:
		Prerequisites: ~disabled

FTRK:
	Buildable:
		Prerequisites: ~disabled

MRJ:
	Buildable:
		Prerequisites: ~disabled

MGG:
	Buildable:
		Prerequisites: ~disabled

TTNK:
	Buildable:
		Prerequisites: ~disabled

QTNK:
	Buildable:
		Prerequisites: ~disabled

DTRK:
	Buildable:
		Prerequisites: ~disabled

CTNK:
	Buildable:
		Prerequisites: ~disabled

STNK:
	Buildable:
		Prerequisites: ~disabled

MSUB:
	Buildable:
		Prerequisites: ~disabled

Camera.SAM:
	Inherits: CAMERA
	RevealsShroud:
		Range: 2c0

powerproxy.paras1:
	Inherits: powerproxy.paratroopers
	ParatroopersPower:
		DropItems: E1,E1,E1,E2,3TNK

powerproxy.paras2:
	Inherits: powerproxy.paratroopers
	ParatroopersPower:
		DropItems: E1,E1,E1,E2,E2
with:

Code: Select all

MapFormat: 11

RequiresMod: ra

Title: 3pl- Evacuation

Author: Scott_NZ & Zypres

Tileset: SNOW

MapSize: 128,128

Bounds: 16,16,96,96

Visibility: Lobby, MissionSelector

Categories: Mission, Cooperative Mission

LockPreview: True

Players:
	PlayerReference@Neutral:
		Name: Neutral
		OwnsWorld: True
		NonCombatant: True
		Faction: allies
	PlayerReference@Allies1:
		Name: Allies1
		AllowBots: False
		Playable: True
		Required: True
		LockFaction: True
		Faction: allies
		LockColor: True
		Color: ABB7E4
		LockSpawn: True
		LockTeam: True
		Allies: Allies2, Allies, Allies3
		Enemies: Soviets
	PlayerReference@Allies2:
		Name: Allies2
		AllowBots: False
		Playable: True
		LockFaction: True
		Faction: allies
		LockColor: True
		Color: A1EF8C
		LockSpawn: True
		LockTeam: True
		Allies: Allies1, Allies, Allies3
		Enemies: Soviets
	PlayerReference@Allies3:
		Name: Allies3
		AllowBots: False
		Playable: True
		LockFaction: True
		Faction: allies
		LockColor: True
		Color: DA8CEF
		LockSpawn: True
		LockTeam: True
		Allies: Allies1, Allies, Allies2
		Enemies: Soviets		
	PlayerReference@Allies:
		Name: Allies
		Bot: campaign
		NonCombatant: True
		Faction: allies
		Color: 5CC1A3
		Allies: Allies1, Allies2, Allies3
		Enemies: Soviets
	PlayerReference@Soviets:
		Name: Soviets
		Bot: campaign
		Faction: soviet
		Color: FE1100
		Enemies: Allies1, Allies2, Allies
Where I want to
  • Show playernames ingame
  • Fix so all players camera start on left side
  • Limit to 3 helikopters at the same time
  • Fix sam and rocketmen, so they will shoot at heli

User avatar
zypres1
Posts: 276
Joined: Mon Oct 24, 2011 8:22 pm

Re: 3 player map help

Post by zypres1 »

Hurray, it's been some great work on https://resource.openra.net/maps/33993/

It was Jeff560BZHfr who made the edit here: https://resource.openra.net/maps/35906/
Now it's possible to play, and have fun, but we need some more work done:
  • activate paratroopers instead of sendparatroopers (we get error)
  • change color on building to cap?, now it looks like the players
  • change color on players, it seemed the same now
  • change to next mission later? when one objective is done, but also all should be listed on missions
  • build on same team should be forced on?
  • text about us and mission, and some tips
  • text when strategic buildings gets taken out: "no more ships for enemy", "no more air after air command taken"
  • what finishes the map?

Try it out, its already fun to play with someone else..

User avatar
zypres1
Posts: 276
Joined: Mon Oct 24, 2011 8:22 pm

Re: 3 player map help

Post by zypres1 »

3 player map to fix:
player names on building
remove tanya?
sam not working
one engie each when tesla is destroyed?
change mcv to other players than the one who got, two others?
what is the mission? kill all? ships? what if tanya dies?
owner of buildings should have tooltip

tanya in choppper, should be told to do
all players should see objetives
end game, how?

Post Reply