class Gamefic::Sdk::Diagram
Constants
- DIAGRAMMABLE
Attributes
@return [Gamefic::Plot]
Public Class Methods
Public Instance Methods
Source
# File lib/gamefic-sdk/diagram.rb, line 77 def commands { responses: responses, verbs: verbs, syntaxes: syntaxes } end
Source
# File lib/gamefic-sdk/diagram.rb, line 57 def entities plot.entities.map do |ent| { name: ent.name, type: ent.class, parent: ent.parent&.name } end end
Source
# File lib/gamefic-sdk/diagram.rb, line 29 def get type if valid?(type) send(type) else raise ArgumentError, "Unknown diagram type '#{type}'" end end
Source
# File lib/gamefic-sdk/diagram.rb, line 67 def responses plot.playbook.responses.map do |act| { verb: act.verb, meta: act.meta?, # signature: act.signature } end end
Source
# File lib/gamefic-sdk/diagram.rb, line 41 def rooms clear position = Position.new plot.entities.that_are(Room).each do |room| proceed_from room, position next_x = right next_y = bottom if next_x > next_y position = Position.new(0, next_y + distance) else position = Position.new(next_x + distance, 0) end end elements.values end
Source
# File lib/gamefic-sdk/diagram.rb, line 100 def scenes plot.scenebook.scenes.map do |scene| { name: scene.name, type: scene.type } end end
Source
# File lib/gamefic-sdk/diagram.rb, line 89 def syntaxes plot.syntaxes.map do |syn| { template: syn.template, command: syn.command, synonym: syn.synonym, verb: syn.verb } end end
Source
# File lib/gamefic-sdk/diagram.rb, line 109 def valid? type DIAGRAMMABLE.include?(type) end
Private Instance Methods
Source
# File lib/gamefic-sdk/diagram.rb, line 165 def bottom max_y = 0 elements.values.each do |el| next if el[:position].nil? max_y = [max_y, el[:position][:y]].max end max_y end
Source
# File lib/gamefic-sdk/diagram.rb, line 123 def entity_uid entity raise "Invalid entity" if plot.entities.index(entity).nil? "EIN_#{plot.entities.index(entity)}" end
Source
# File lib/gamefic-sdk/diagram.rb, line 191 def move_from position, direction case direction when 'north' position.move 0, -distance when 'south' position.move 0, distance when 'west' position.move -distance, 0 when 'east' position.move distance, 0 when 'northwest' position.move -distance * 0.5, -distance * 0.5 when 'northeast' position.move distance * 0.5, -distance * 0.5 when 'southwest' position.move -distance * 0.5, distance * 0.5 when 'southeast' position.move distance * 0.5, distance * 0.5 end end
Source
# File lib/gamefic-sdk/diagram.rb, line 183 def position_taken?(position) elements.values.each do |el| next if el[:position].nil? return true if el[:position][:x] == position.x and el[:position][:y] == position.y end false end
Source
# File lib/gamefic-sdk/diagram.rb, line 128 def proceed_from room, position return if elements.has_key?(room) directions = ['north', 'south', 'west', 'east', 'northwest', 'northeast', 'southwest', 'southeast'] rel = { data: {} } rel[:data][:id] = entity_uid(room) rel[:data][:label] = room.definitely rel[:position] = { x: position.x, y: position.y } elements[room] = rel room.children.that_are(Portal).each do |portal| next if portal.destination.nil? # For lack of a better way to lay them out, 'up' and 'down' are not # treated as specific directions if portal.direction.nil? or portal.direction.to_s == 'up' or portal.direction.to_s == 'down' direction = directions.shift new_pos = move_from(position, direction) while position_taken?(new_pos) direction = directions.shift return if direction.nil? new_pos = move_from(position, direction) end else directions.delete portal.direction.to_s new_pos = move_from(position, portal.direction.to_s) end proceed_from portal.destination, new_pos pel = { data: {} } pel[:data][:id] = entity_uid(portal) pel[:data][:source] = entity_uid(room) pel[:data][:target] = entity_uid(portal.destination) elements[portal] = pel end end
Source
# File lib/gamefic-sdk/diagram.rb, line 174 def right max_x = 0 elements.values.each do |el| next if el[:position].nil? max_x = [max_x, el[:position][:x]].max end max_x end