Jump to content

R&D XCOM Map Alterations


Amineri

Recommended Posts

  • Replies 473
  • Created
  • Last Reply

Top Posters In This Topic

@Liquid -- you can count on it. No doubt this will be the most significant new feature of B14 if we can get it working.

 

....

 

@ Ghost (and Liquid too if you can explain it) -- I don't see in the code you posted any reference to spawn locations, so I take it that will be an additional mod section that will need to be added.

 

Sorry, this is how I was with Amineri, too, when she unlocked some major new feature potential -- I can see roughly what's going on and can handle implementation, but I need someone to hold my hand through the first time of getting it working.

Link to comment
Share on other sites

TheWorld.PersistentLevel.XComSpawnPoint_X is where a pawn pops up ,at the moment I'm trying to figure out why it isn't spawning them.I've already figured how to move the dropzone but my code uses absolute offsets and i still have to learn ghost's style. Idealy , I think we can make exalt missions out of any map. Check a few pages back, I have spammed the thread with posts xD

Edited by LiQuiD911
Link to comment
Share on other sites

Yeah, you folks are covering new ground so fast it's too confusing and hard to keep straight for those of us not deep in the weeds of the code. Once you have finished working out the essentials we will need a recap that I can then transcribe to the wiki. But we are not there yet.

 

But very exciting to see. :tongue: I know many people are hoping for new maps, or at least variations of the existing ones.

 

-Dubious-

Edited by dubiousintent
Link to comment
Share on other sites

wghost, could you please verify this: not all maps accept streaming XcomSpawnPoints.

 

These accept new spawnpoints

Police station,Military Ammo,Hive,Highwayconstruction,Rooftops,Small cemetery,Street Hurricane,Office paper,Liquor store,Fast food,Boulevard,Bar,CommercialStreet

 

while maps like trainyard, trainstation, industrial office,cemetery grand,street overspass do not move the pawns to new locations ( well.. they move a single pawn while the others remain in their default place after applying your patches the entire squad remains in it's default place, I suppose it's related to the group tags).

I haven't tested the rest. The spawn point code you sent me works, but I was testing it on street overpass.

 

 

This moves the Dropzone. This Object code is pure magic!xD Before I was comparing hex values of floats to find the offsets.

OBJECT=TheWorld.PersistentLevel.XComLevelActor_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<%f  xxx> <%f yyy> <%f zzz> // Vector(x,y,z)

OBJECT=TheWorld.PersistentLevel.XComBuildingVolume_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<%f xxx> <%f yyy> <%f zzz> // Vector(x,y,z)

Oddly the Volume rotator doesn't work. However that's not a problem because we can use the Pier_streamB which is very similar to the outpost stream but the dropzone is rotated by 90 degrees


OBJECT=TheWorld.PersistentLevel.XComLevelActor_1
FIND_CODE=<Rotation> <StructProperty> <%u 0xC> <%u 0> <Rotator>:END
MODDED_CODE=<%f  0> <%f 90> <%f 0> // Rotator (Pitch, Yaw, Roll)

OBJECT=TheWorld.PersistentLevel.XComBuildingVolume_1
FIND_CODE=<Rotation> <StructProperty> <%u 0xC> <%u 0> <Rotator>:END
MODDED_CODE=<%f  0> <%f 90> <%f 0> // Rotator (Pitch, Yaw, Roll)
Edited by LiQuiD911
Link to comment
Share on other sites

Drop zone moved:

http://steamcommunity.com/sharedfiles/filedetails/?id=311869706

 

PatcherGUI code:

 

UPK_FILE=Base_LZ_Mod_Stream_0000000.upk

ALIAS=PlayerStart:<%f 2351> <%f 1487> <%f 64>
ALIAS=XComBuildingVolume:<%f 2587> <%f 1478> <%f 121>
ALIAS=XComLevelActor:<%f 2572> <%f 1498> <%f 27>
ALIAS=XComSpawnPoint1:<%f 2156> <%f 1286> <%f 75>
ALIAS=XComSpawnPoint2:<%f 2348> <%f 1286> <%f 75>
ALIAS=XComSpawnPoint3:<%f 2156> <%f 1670> <%f 75>
ALIAS=XComSpawnPoint4:<%f 2060> <%f 1478> <%f 75>
ALIAS=XComSpawnPoint5:<%f 2348> <%f 1670> <%f 75>
ALIAS=XComSpawnPoint6:<%f 2252> <%f 1478> <%f 75>
ALIAS=PointInSpace:<%f 2108> <%f 1238> <%f 27>
//ALIAS=PrefabInstance:<%f 2016> <%f -1056> <%f 0>

//ALIAS=PlayerRotation:<%i 0> <%i -31328> <%i 0>

OBJECT=TheWorld.PersistentLevel.PlayerStart_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!PlayerStart>

/*FIND_CODE=<Rotation> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!PlayerRotation>*/

OBJECT=TheWorld.PersistentLevel.PointInSpace_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!PointInSpace>

/*OBJECT=TheWorld.PersistentLevel.PrefabInstance_0
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!PrefabInstance>*/

OBJECT=TheWorld.PersistentLevel.XComBuildingVolume_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComBuildingVolume>

OBJECT=TheWorld.PersistentLevel.XComLevelActor_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComLevelActor>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_10
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint1>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_11
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint2>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_6
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint3>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_7
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint4>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_8
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint5>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_9
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint6>

 

 

I have a LibreOffice Cals file to re-calculate relative offsets, based on PlayerStart Location. But I think I'll just make an utility for this to avoid too much copy-pasting.

 

I'll test all the maps you mentioned, LiQuiD911 and will report the results.

Link to comment
Share on other sites

Objects we trying to stream have different names for those maps. I tried to rename stream objects to match map objects, but with no luck: still only one unit is moved to new spawn zone.

 

Here's the code to make a new stream from the existing Base_LZ_Mod_Stream_0000000.upk

 

 

UPK_FILE=Base_LZ_Mod_Stream_0000001.upk

RENAME=Base_LZ_Mod_Stream_0000000:Base_LZ_Mod_Stream_0000001

ALIAS=PlayerStart:<%f 1583> <%f 1871> <%f 64>
ALIAS=XComBuildingVolume:<%f 1819> <%f 1862> <%f 121>
ALIAS=XComLevelActor:<%f 1804> <%f 1882> <%f 27>
ALIAS=XComSpawnPoint1:<%f 1388> <%f 1670> <%f 75>
ALIAS=XComSpawnPoint2:<%f 1580> <%f 1670> <%f 75>
ALIAS=XComSpawnPoint3:<%f 1388> <%f 2054> <%f 75>
ALIAS=XComSpawnPoint4:<%f 1292> <%f 1862> <%f 75>
ALIAS=XComSpawnPoint5:<%f 1580> <%f 2054> <%f 75>
ALIAS=XComSpawnPoint6:<%f 1484> <%f 1862> <%f 75>
ALIAS=PointInSpace:<%f 1340> <%f 1622> <%f 27>
ALIAS=PrefabInstance:<%f 1340> <%f 1622> <%f 27>

//ALIAS=PlayerRotation:<%i 0> <%i -31328> <%i 0>

OBJECT=TheWorld.PersistentLevel.PlayerStart_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!PlayerStart>

/*FIND_CODE=<Rotation> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!PlayerRotation>*/

OBJECT=TheWorld.PersistentLevel.PointInSpace_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!PointInSpace>

OBJECT=TheWorld.PersistentLevel.PrefabInstance_0
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!PrefabInstance>

OBJECT=TheWorld.PersistentLevel.XComBuildingVolume_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComBuildingVolume>

OBJECT=TheWorld.PersistentLevel.XComLevelActor_1
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComLevelActor>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_10
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint1>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_11
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint2>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_6
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint3>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_7
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint4>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_8
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint5>

OBJECT=TheWorld.PersistentLevel.XComSpawnPoint_9
FIND_CODE=<Location> <StructProperty> <%u 0xC> <%u 0> <Vector>:END
MODDED_CODE=<!XComSpawnPoint6>

EXPORT_ENTRY=TheWorld.PersistentLevel.PrefabInstance_0
FIND_CODE=<PrefabInstance_0>
MODDED_CODE=<PrefabInstance_14>

EXPORT_ENTRY=TheWorld.PersistentLevel.PointInSpace_1
FIND_CODE=<PointInSpace_1>
MODDED_CODE=<PointInSpace_0>

EXPORT_ENTRY=TheWorld.PersistentLevel.XComBuildingVolume_1
FIND_CODE=<XComBuildingVolume_1>
MODDED_CODE=<XComBuildingVolume_4>

EXPORT_ENTRY=TheWorld.PersistentLevel.XComLevelActor_1
FIND_CODE=<XComLevelActor_1>
MODDED_CODE=<XComLevelActor_69>

EXPORT_ENTRY=TheWorld.PersistentLevel.XComSpawnPoint_10
FIND_CODE=<XComSpawnPoint_10>
MODDED_CODE=<XComSpawnPoint_3>

EXPORT_ENTRY=TheWorld.PersistentLevel.XComSpawnPoint_11
FIND_CODE=<XComSpawnPoint_11>
MODDED_CODE=<XComSpawnPoint_5>

 

 

Copy Base_LZ_Mod_Stream_0000000.upk to Base_LZ_Mod_Stream_0000001.upk before applying.

Edited by wghost81
Link to comment
Share on other sites

I have successfully moved LZ for TrainStation map using script:

 

 

UPK_FILE=XComGame.upk

ALIAS=PlayerStart:<%f 1583> <%f 1871> <%f 64>
ALIAS=XComBuildingVolume:<%f 1819> <%f 1862> <%f 121>
ALIAS=XComLevelActor:<%f 1804> <%f 1882> <%f 27>
ALIAS=XComSpawnPoint1:<%f 1388> <%f 1670> <%f 75>
ALIAS=XComSpawnPoint2:<%f 1580> <%f 1670> <%f 75>
ALIAS=XComSpawnPoint3:<%f 1388> <%f 2054> <%f 75>
ALIAS=XComSpawnPoint4:<%f 1292> <%f 1862> <%f 75>
ALIAS=XComSpawnPoint5:<%f 1580> <%f 2054> <%f 75>
ALIAS=XComSpawnPoint6:<%f 1484> <%f 1862> <%f 75>
ALIAS=PointInSpace:<%f 1340> <%f 1622> <%f 27>

[ADD_EXPORT_ENTRY]
<Core.ObjectProperty>			// Type
<NullRef>						// ParentClassRef
<XGBattle_SP.PostLevelLoaded>	// OwnerRef
<A>								// NameIdx
<NullRef>						// ArchetypeRef
<% u0x00000000>					// flags H
<% u0x00070004>					// flags L
<%u 44>							// serial size
<%u 0>							// serial offset
<%u 0>							// export flags
<%u 0>							// net objects count
<%u 0>							// GUID1
<%u 0>							// GUID2
<%u 0>							// GUID3
<%u 0>							// GUID4
<%u 0>							// unknown

OBJECT=XGBattle_SP.PostLevelLoaded.A
REL_OFFSET=16					// skip PrevObjRef + Empty DefaultProperties List + NextObjRef
[MODDED_CODE]
<%s 1>							// ArrayDim
<%s 0>							// ElementSize
<%u 0x00000000>					// flags L
<%u 0x00000000>					// flags H
<None>							// CategoryIndex
<NullRef>						// ArrayEnumRef
<Engine.Actor>					// OtherObjRef

OBJECT=XGBattle_SP.PostLevelLoaded:AUTO
[REPLACEMENT_CODE]
//super.PostLevelLoaded()
1C <XGBattle.PostLevelLoaded> 16

//FindActorByName('PlayerStart_1', A)
1C <Engine.Actor.FindActorByName> 21 <PlayerStart_1> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!PlayerStart>

//FindActorByName('PointInSpace_0', A)
1C <Engine.Actor.FindActorByName> 21 <PointInSpace_0> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!PointInSpace>

//FindActorByName('XComBuildingVolume_4', A)
1C <Engine.Actor.FindActorByName> 21 <XComBuildingVolume_4> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComBuildingVolume>

//FindActorByName('XComLevelActor_69', A)
1C <Engine.Actor.FindActorByName> 21 <XComLevelActor_69> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComLevelActor>

//FindActorByName('XComSpawnPoint_3', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_3> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint1>

//FindActorByName('XComSpawnPoint_5', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_5> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint2>

//FindActorByName('XComSpawnPoint_6', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_6> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint3>

//FindActorByName('XComSpawnPoint_7', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_7> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint4>

//FindActorByName('XComSpawnPoint_8', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_8> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint5>

//FindActorByName('XComSpawnPoint_9', A)
1C <Engine.Actor.FindActorByName> 21 <XComSpawnPoint_9> 00 <.A> 16
//A.Location = vect(x, y, z)
0F 19 00 <.A> 09 00 <Engine.Actor.Location> 00 01 <Engine.Actor.Location>
23 <!XComSpawnPoint6>

//if(Desc().ShouldSpawnMeldCanisters())
07 [@NoMeld] 19 1B <Desc> 16 0A 00 <XGBattleDesc.ShouldSpawnMeldCanisters.ReturnValue> 00 1B <ShouldSpawnMeldCanisters> 16

//InitMeldContainers()
1B <InitMeldContainers> 16

[#NoMeld]

//InitCapturePoints()
1B <InitCapturePoints> 16

//return
04 0B

//EOS
53

 

 

Test with original URB_TrainStation map only! This code will mess up starting points for all the other maps, so don't even try a different map with this mod installed!

 

At this point I can tell that we can safely handle LZ relocation inside XGBattle_SP.PostLevelLoaded function. This function is called after levels streaming is complete and before players are initiated, so it's a perfect place to move already loaded map objects.

 

LZ consists of 10 objects. Those objects have different names for different maps. I can find a map object by type and by name from inside a script, but not by archetype. At least, haven't yet found a way to do it. But I'll keep trying.

 

I'm going to add a config variable, which will be exposed in DefaultMaps and will hold LZ center point locations list for each map. If I won't be able to sort objects by archetype, I'd need to expose those 10 object names for editing via config too.

Edited by wghost81
Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...