artemis-nerds / protocol-docs

Unofficial documentation for the Artemis network and file protocols, written by the Artemis community
https://artemis-nerds.github.io/protocol-docs/
MIT License
8 stars 5 forks source link

simpleEvent:19 = biomech rage level #198

Open rjwut opened 4 years ago

rjwut commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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.

JordanLongstaff commented 4 years ago

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 commented 4 years ago

Running a mini-audit for you now. This feels like a "big data" exercise - my Day Job :tm: :laughing:

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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 commented 4 years ago

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

rjwut commented 4 years ago

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

NoseyNick commented 4 years ago

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 commented 4 years ago

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

NoseyNick commented 4 years ago

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. :man_shrugging: ... 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 commented 4 years ago

See also #105