Module: Lich::Gemstone::Group::Observer

Defined in:
documented/gemstone/group.rb

Overview

Observes game output and automatically updates Group state. Watches for group-related messages and updates membership, leadership, and status.

Defined Under Namespace

Modules: Term

Class Method Summary collapse

Class Method Details

.consume(line, match_data) ⇒ void

This method returns an undefined value.

Processes a line of group-related game output and updates Group state. Handles all types of group changes: joins, leaves, leadership changes, etc.

Parameters:

  • line (String)

    line of game output

  • match_data (MatchData)

    regex match data from the line



450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
# File 'documented/gemstone/group.rb', line 450

def self.consume(line, match_data)
  if line.include?(Term::GIVEN_LEADERSHIP)
    return Group.leader = :self
  end

  ## Group indicator changed!
  if line.include?(Term::GROUP_EMPTIED)
    Group.leader = :self
    return Group._members.clear
  end

  people = exist(line)

  if line.include?("You are leading")
    Group.leader = :self
  elsif line.include?("You are grouped with")
    Group.leader = people.first
  end

  case line
  when Term::NO_GROUP, Term::DISBAND
    Group.leader = :self
    return Group._members.clear
  when Term::STATUS
    Group.status = match_data[:status].to_sym
    return Group.checked = true
  when Term::GAVE_LEADER_AWAY
    Group.push(people.first)
    return Group.leader = people.first
  when Term::ADDED_TO_NEW_GROUP, Term::JOINED_NEW_GROUP
    Group.checked = false
    Group.push(people.first)
    return Group.leader = people.first
  when Term::SWAP_LEADER
    (old_leader, new_leader) = people
    Group.push(*people) if Group.include?(old_leader) or Group.include?(new_leader)
    return Group.leader = new_leader
  when Term::LEADER_ADDED_MEMBER
    (leader, added) = people
    Group.push(added) if Group.include?(leader)
  when Term::LEADER_REMOVED_MEMBER
    (leader, removed) = people
    return Group.delete(removed) if Group.include?(leader)
  when Term::JOIN, Term::ADD, Term::NOOP
    return Group.push(*people)
  when Term::MEMBER
    return Group.refresh(*people)
  when Term::HOLD_FRIENDLY_FIRST, Term::HOLD_NEUTRAL_FIRST, Term::HOLD_RESERVED_FIRST, Term::HOLD_WARM_FIRST
    return Group.push(people.first)
  when Term::HOLD_FRIENDLY_SECOND, Term::HOLD_NEUTRAL_SECOND, Term::HOLD_RESERVED_SECOND, Term::HOLD_WARM_SECOND
    Group.checked = false
    Group.push(people.first)
    return Group.leader = people.first
  when Term::HOLD_FRIENDLY_THIRD, Term::HOLD_NEUTRAL_THIRD, Term::HOLD_RESERVED_THIRD, Term::HOLD_WARM_THIRD
    (leader, added) = people
    Group.push(added) if Group.include?(leader)
  when Term::OTHER_JOINED_GROUP
    (added, leader) = people
    Group.push(added) if Group.include?(leader)
  when Term::LEAVE, Term::REMOVE
    return Group.delete(*people)
  end
end

.exist(xml) ⇒ Array<GameObj>

Extracts GameObj instances from XML character links in game output.

Parameters:

  • xml (String)

    game output containing character XML tags

Returns:

  • (Array<GameObj>)

    array of GameObj instances found in the XML



433
434
435
# File 'documented/gemstone/group.rb', line 433

def self.exist(xml)
  xml.scan(Group::Observer::Term::EXIST).map { |id, _noun, _name| GameObj[id] }
end

.wants?(line) ⇒ Boolean

Checks if a line of game output contains group-related information.

Parameters:

  • line (String)

    line of game output

Returns:

  • (Boolean)

    true if line contains group information



440
441
442
443
# File 'documented/gemstone/group.rb', line 440

def self.wants?(line)
  line.strip.match(Term::ANY) or
    line.include?(Term::GROUP_EMPTIED)
end