Method: Api::CargoPanel#_encode

Defined in:
lib/sc2ai/protocol/ui_pb.rb

#_encode(buff) ⇒ Object



6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
# File 'lib/sc2ai/protocol/ui_pb.rb', line 6358

def _encode(buff)
  val = @unit
  if val
    buff << 0x0a

    # Save the buffer size before appending the submessage
    current_len = buff.bytesize

    # Write a single dummy byte to later store encoded length
    buff << 42 # "*"
    val._encode(buff)

    # Calculate the submessage's size
    submessage_size = buff.bytesize - current_len - 1

    # Hope the size fits in one byte
    byte = submessage_size & 0x7F
    submessage_size >>= 7
    byte |= 0x80 if submessage_size > 0
    buff.setbyte(current_len, byte)

    # If the sub message was bigger
    if submessage_size > 0
      current_len += 1

      # compute how much we need to shift
      encoded_int_len = 0
      remaining_size = submessage_size
      while remaining_size != 0
        remaining_size >>= 7
        encoded_int_len += 1
      end

      # Make space in the string with dummy bytes
      buff.bytesplice(current_len, 0, "*********", 0, encoded_int_len)

      # Overwrite the dummy bytes with the encoded length
      while submessage_size != 0
        byte = submessage_size & 0x7F
        submessage_size >>= 7
        byte |= 0x80 if submessage_size > 0
        buff.setbyte(current_len, byte)
        current_len += 1
      end
    end

    buff
  end

  list = @passengers
  if list.size > 0
    list.each do |item|
      val = item
      if val
        buff << 0x12

        # Save the buffer size before appending the submessage
        current_len = buff.bytesize

        # Write a single dummy byte to later store encoded length
        buff << 42 # "*"
        val._encode(buff)

        # Calculate the submessage's size
        submessage_size = buff.bytesize - current_len - 1

        # Hope the size fits in one byte
        byte = submessage_size & 0x7F
        submessage_size >>= 7
        byte |= 0x80 if submessage_size > 0
        buff.setbyte(current_len, byte)

        # If the sub message was bigger
        if submessage_size > 0
          current_len += 1

          # compute how much we need to shift
          encoded_int_len = 0
          remaining_size = submessage_size
          while remaining_size != 0
            remaining_size >>= 7
            encoded_int_len += 1
          end

          # Make space in the string with dummy bytes
          buff.bytesplice(current_len, 0, "*********", 0, encoded_int_len)

          # Overwrite the dummy bytes with the encoded length
          while submessage_size != 0
            byte = submessage_size & 0x7F
            submessage_size >>= 7
            byte |= 0x80 if submessage_size > 0
            buff.setbyte(current_len, byte)
            current_len += 1
          end
        end

        buff
      end
    end
  end

  val = @slots_available
  if has_slots_available?
    buff << 0x18

    loop do
      byte = val & 0x7F

      val >>= 7
      # This drops the top bits,
      # Otherwise, with a signed right shift,
      # we get infinity one bits at the top
      val &= (1 << 57) - 1

      byte |= 0x80 if val != 0
      buff << byte
      break if val == 0
    end
  end
  buff << @_unknown_fields if @_unknown_fields
  buff
end