Skip to content
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

simpleEvent:19 = biomech rage level #198

Open
rjwut opened this issue Apr 21, 2020 · 14 comments
Open

simpleEvent:19 = biomech rage level #198

rjwut opened this issue Apr 21, 2020 · 14 comments

Comments

@rjwut
Copy link
Member

rjwut commented Apr 21, 2020

I can confirm that when the biomechs become hostile, the following packet gets sent:

efbeadde          // header
20000000          // packet length = 32
01000000          // origin = server
00000000          // padding
0c000000          // remaining length = 12
fec854f7 19000000 // BiomechStancePacket?
04000000          // angry?

I have not yet managed to capture a packet where you hail a stage 4 biomech and calm the tribe. The protocol docs note that values of 0, 2, 3, and 4 have been observed in the payload after the subtrype. Presumably 4 = angry? So what do 0, 2, and 3 mean? Why have we not observed 1?

@rjwut
Copy link
Member Author

rjwut commented Apr 21, 2020

Is calming down the biomechs even a thing anymore? It seems like if you attempt to hail a hostile biomech it just freezes in place.

@rjwut
Copy link
Member Author

rjwut commented Apr 21, 2020

Further observations with regards to the last int in the packet: If you specify any value other than 0, the client renders the biomechs as hostile. If you send another packet with a 0 while the biomechs are hostile, the client renders them as docile once again.

@rjwut
Copy link
Member Author

rjwut commented Apr 22, 2020

The last value in the packet is the biomech rage level. It starts at 0 (docile). When a biomech is attacked it goes to 4. It is allegedly possible to interact with the biomechs to reduce their rage level by 1. Doing so four times pacifies them. However, in practice I haven't been successful at actually doing this.

@rjwut rjwut changed the title simpleEvent:19 = biomech stance? simpleEvent:19 = biomech rage level Apr 22, 2020
@JordanLongstaff
Copy link
Contributor

So, if this is understood properly, 0 is the starting value of the biomech's hostility (docile), 4 is its maximum hostility which is triggered every time a player ship attacks it, and that's the only way to increase its hostility but there is supposedly also a way to tame it again.

Apparently the way to tame them is to "hail" a stage 4 biomech, thus calming everybody down? What does you mean, hail them? Are you referring to the scramble signals?

@NoseyNick
Copy link
Collaborator

NoseyNick commented Apr 22, 2020

Running a mini-audit for you now.
This feels like a "big data" exercise - my Day Job ™️ 😆

My archive contains a total of 987 "Unknown_f754c8fe_19" packets, however I don't usually index the VALUE, I had to do a full re-parse of almost every game I've ever captured, but here y'go:

    829 Unknown_f754c8fe_19(0);
      1 Unknown_f754c8fe_19(2);
      1 Unknown_f754c8fe_19(3);
    150 Unknown_f754c8fe_19(4);

... so the values of 2 and 3 are pretty rare. Most games seem to start out with 0, SOME games seem to later send 4. That could be somewhat consistent with "angering biomechs"?

The game where it had other values (I've included Unknown_f754c8fe_19 and heartbeat packets to give a sense of timing):

### captures/artemis-2018-01-17.2326.01s.xz :
      1 Unknown_f754c8fe_19(0);
    593 heartbeat();
      1 Unknown_f754c8fe_19(4);
      5 heartbeat();
      1 Unknown_f754c8fe_19(3);
     51 heartbeat();
      1 Unknown_f754c8fe_19(2);
      5 heartbeat();

... might look like they are calming down / being calmed? This was a 2.6.0 level 10 Siege game with a ship called "Weeping Somnambulist", <vessel uniqueID="33"> which doesn't exist in the default game so must have been one of the mods.

Might never have seen Unknown_f754c8fe_19(1) just because nobody has ever "calmed them" enough? If that's even "a thing" any more?

@JordanLongstaff
Copy link
Contributor

Did those lower-valued packets occur by themselves, or was there another event (besides a heartbeat packet) that preceded each, e.g. a "hail" or scramble signal? In other words, did the values go down because the player did something explicitly to calm the biomechs?

@NoseyNick
Copy link
Collaborator

NoseyNick commented Apr 23, 2020

BTW I updated the above comment with the full overnight results. Still only one that went 0 to 4 to 3 to 2 but never to 1 never mind to 0 again.

Did those lower-valued packets occur by themselves, or was there another event (besides a heartbeat packet) that preceded each, e.g. a "hail" or scramble signal?

Great question! The above file IS available in my archive if you want to parse it yourself BTW, but let me see...

SkyBox(15);
Unknown_f754c8fe_08(0); # sound-effect related? volume?
startGame(10,'Siege');
AllShipSettings(
  ShipSetting(0,33,0.216666668653488, UTF16("Weeping Somnambulist")), # Warp UNKNOWN_SHIP
  ShipSetting(0,35,0.125, UTF16("Intrepid")), # Warp UNKNOWN_SHIP
  ShipSetting(0,0,0.25, UTF16("Aegis")), # Warp LightCruiser
  ShipSetting(0,0,0.375, UTF16("Horatio")), # Warp LightCruiser
  ShipSetting(0,0,0.5, UTF16("Excalibur")), # Warp LightCruiser
  ShipSetting(0,0,0.625, UTF16("Hera")), # Warp LightCruiser
  ShipSetting(0,0,0.75, UTF16("Ceres")), # Warp LightCruiser
  ShipSetting(0,0,0.875, UTF16("Diana")), # Warp LightCruiser
);
Poof(55765.7265625,0,0);
Poof(31139.876953125,0,17266.89453125);
Poof(75921.921875,0,62752.33203125);
Poof(69517.15625,0,54368.1171875);
objectText(3469,3,UTF16("Intel: Stage 1 BioMech consumes asteroids to produce growth material. Once internal growth material reaches 28 kt it will mature into Stage 2.  Anti-proton levels : 01.100")); # 3=scan_desc
objectText(3470,3,UTF16("Intel: Stage 3 BioMech consumes anomalies. The reason is unknown but Naval Intelligence estimates that once energy levels reach 50 GWh it will mature into a Stage 4 adult.  Anti-proton levels : 01.100")); # 3=scan_desc
# bunch of commText() ...

# initial collection of full or mostly-full objectBitStream() packets including...
ObjNPCShip(3470,
  Name=>UTF16("Y42"),Throttle=>1,Rudder=>0.520331263542175,
  MaxImpulse=>5.39999961853027,MaxTurnRate=>0.0240000002086163,
  IsEnemy=>5,VesselType=>6002,
  X=>83185.546875,Y=>0,Z=>52909.671875,
  Pitch=>0,Roll=>-0.213703319430351,Heading=>-1.67809510231018,
  Velocity=>0.400000095367432,Surrendered=>0,InNebula=>0,
  ForeShields=>175,ForeShieldsMax=>175,
  AftShields=>175,AftShieldsMax=>175,
  Unknown35=>1,FleetNum=>255,EliteAbility=>0,EliteInUse=>0,
  SingleScan=>0,DoubleScan=>1073741824,ShowOnMaps=>4294967295,
  Side=>30,Unknown45=>255,Unknown46=>255,Unknown47=>1,
  targetPointX=>-100000,targetPointY=>0,targetPointZ=>0,
  BeamsDamg=>0,TorpsDamg=>0,SenseDamg=>0,ManuvDamg=>0,
  ImpulDamg=>0,DriveDamg=>0,FShldDamg=>0,AShldDamg=>0,
  ShFreqA=>0.343693375587463,ShFreqB=>0.877706170082092,
  ShFreqC=>0.743388175964355,ShFreqD=>0.631763637065887,
  ShFreqE=>0.336857199668884),# full
# reason I quoted this will become obvious later...
#  Corresponds to <vessel uniqueID="6002" side="6" classname="Stage 3" broadType="large anomalyeater">
# <long_desc text="Young adult BioMech. This is the most aggressive stage of development. Proceed with caution."/>

# and other objectBitStream()s ...
ObjNPCShip(3529,Name=>UTF16("N36"), # .....
# and other objectBitStream()s ...

Unknown_f754c8fe_19(0);
# ... so basically at the start of the game, right before the 1st:
heartbeat();

# MUCH MUCH later...

ObjPlayerShip(5182,Target=>0,Impulse=>0,Rudder=>0.5,
  MaxImpulse=>1.04999995231628,TurnRate=>0.0299999993294477,
  AutoBeams=>1,WarpFactor=>0,Energy=>1000,ShieldsUp=>0
  ,Unknown22=>1,ShipType=>100,
  X=>42841.34375,Y=>43.429141998291,Z=>36698.62109375,
  Pitch=>3.14159274101257,Roll=>3.14159274101257,
  Heading=>-1.63987457752228,Velocity=>0.063000001013279,
  InNebula=>0,Name=>UTF16("IndKMK-4"),
  ForeShields=>85,ForeShieldsMax=>85,
  AftShields=>0,AftShieldsMax=>0,
  LastDockedBase=>0,RedAlert=>0,Unknown43=>200000,
  MainScreenView=>0,BeamFreq=>0,AvailableCoolant=>1,
  ScienceTarget=>0,CaptainTarget=>0,DriveType=>0,
  ScanningID=>0,ScanningProgress=>7.71422651882212e-39,
  Reverse=>0,ClimbDive=>0,Side=>2,ShowOnMaps=>0,
  ShipNum=>255,CapShipID=>2513,AccentHue=>0,EmergencyJumpTime=>0),# full
# So that's a fighter spawned, I think

# time passes...

attack(5484, 9,2, 0, 1,5, 0, 5182,3470, 0,0,0, 0);
# which I think means 5484 is a beam of type 9 (version 2.3.0+) subtype 2
# beam port 0, shooter type 1, target type 5, unknown 0,
# shooter 5182, target 3470,   
# 0,0,0,  0   (auto beams, not manually targetted)

# whole bunch of other stuff but NOT heartbeats so fairly soon after...

GameMessage(UTF16("IndKMK-4 has been destroyed!"));
Kaboom(ObjPlayerShip(5182));
objectDelete(ObjPlayerShip(5182));

# whole bunch of other stuff but NOT heartbeats so fairly soon after...

Unknown_f754c8fe_19(4); # and IMMEDIATELY:
attack(5485, 9,0, 1, 5,5, 0, 3470,3529, 0,0,0, 0);
# which I think means 5485 is a beam of type 9 (version 2.3.0+) subtype 0
# beam port 1, shooter type 5, target type 5, unknown 0,
# shooter 3470, target 3529
# 0,0,0,  0   (auto beams, not manually targetted)

# whole bunch more stuff ...

heartbeat();
commText(8,UTF16("Weeping Somnambulist").UTF16("Y42, surrender now."));

# time passes ...

objectBitStream(ObjEOL());
commText(32,UTF16("Y42").UTF16("Que*stion iGH ^Freedom% 75% #Tolerate*"));
Unknown_f754c8fe_19(3);

# time passes ...

commText(32,UTF16("Y42").UTF16("Que*stion iGH ^Freedom% 50% #Tolerate*"));
Unknown_f754c8fe_19(2);

@NoseyNick
Copy link
Collaborator

Or to simplify, showing only Unknown_f754c8fe_19, heartbeats for timing, attacks involving biomech 3470, fighter 5182 that caused this mess, and the untimely demise of the fighter...

# Start of the game
Unknown_f754c8fe_19(0);
heartbeat(); # first one.

# Lots of time passes

heartbeat();
attack(5481, 9,0, 1, 5,1, 0, 3529,5182, 0,0,0, 0);
attack(5482, 9,0, 0, 5,1, 0, 3530,5182, 0,0,0, 0);
attack(5483, 9,0, 0, 5,1, 0, 3531,5182, 0,0,0, 0);
attack(5484, 9,2, 0, 1,5, 0, 5182,3470, 0,0,0, 0);
GameMessage(UTF16("IndKMK-4 has been destroyed!"));
Kaboom(ObjPlayerShip(5182));
objectDelete(ObjPlayerShip(5182));
Unknown_f754c8fe_19(4);
attack(5485, 9,0, 1, 5,5, 0, 3470,3529, 0,0,0, 0);
heartbeat(); 

heartbeat(); # x 4 and other stuff

commText(32,UTF16("Y42").UTF16("Que*stion iGH ^Freedom% 75% #Tolerate*"));
Unknown_f754c8fe_19(3);

heartbeat(); # x 51 and other stuff

commText(32,UTF16("Y42").UTF16("Que*stion iGH ^Freedom% 50% #Tolerate*"));
Unknown_f754c8fe_19(2);

@rjwut
Copy link
Member Author

rjwut commented Apr 23, 2020

So calming biomechs comes from asking them to surrender? Am I reading this right?

@rjwut
Copy link
Member Author

rjwut commented Apr 23, 2020

And it has to be a different ship than the one that actually injured them?

@NoseyNick
Copy link
Collaborator

Honestly I have NO idea, I'm just passing on decodes from the ONE game (out of an archive of 1455 games) where I've seen values that are not "0" or "4". It might even have been some special scripted-mission behaviour, I have no idea.
Could try to reproduce it?
Is commText(32,UTF16("Y42").UTF16("Question iGH ^Freedom% 75% #Tolerate")) a surrender of some sort then? Certainly doesn't seem to be one of the usual taunts anyway:

  <hullRace ID="6" name="BioMech" keys="enemy loner biomech">
    <taunt immunity="smnewi4f5jH#5ld3@(#k"     text="3.14159265358979"/>
    <taunt immunity="Mk40gH(*HGl45gj3p;32ll0-" text="We are not your enemy!"/>
    <taunt immunity="NNRnjh3h49@98%^km%%%m"    text="Please communicate with us."/>
  </hullRace>

@JordanLongstaff
Copy link
Contributor

Typically when a biomech sends that message, it's in response to a scramble signal (which replace taunts).

@NoseyNick
Copy link
Collaborator

And it has to be a different ship than the one that actually injured them?

Not sure about that either, but it was a fighter that angered the biomech, possibly shot it accidentally, was certainly mid-dogfight with at least 3 other vessels at the time, and in this example the unlucky fighter was technically already destroyed (very) shortly before the Unknown_f754c8fe_19(4); (rage level 4?) was declared. 🤷‍♂️
... and later SOMETHING triggered commText(32,UTF16("Y42").UTF16("Question iGH ^Freedom% 75% #Tolerate")); and a calming to 3, and another and a calming to 2. Assuming Unknown_f754c8fe_19 = biomech rage level which sounds sorta likely?

@NoseyNick
Copy link
Collaborator

See also #105

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants