natural_20 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +99 -0
- data/Rakefile +6 -0
- data/bin/compute_lights +19 -0
- data/bin/console +19 -0
- data/bin/nat20 +135 -0
- data/bin/nat20.cmd +3 -0
- data/bin/nat20author +104 -0
- data/bin/setup +8 -0
- data/char_classes/fighter.yml +45 -0
- data/char_classes/rogue.yml +54 -0
- data/characters/halfling_rogue.yml +46 -0
- data/characters/high_elf_fighter.yml +49 -0
- data/fixtures/battle_sim.yml +58 -0
- data/fixtures/battle_sim_2.yml +30 -0
- data/fixtures/battle_sim_3.yml +26 -0
- data/fixtures/battle_sim_4.yml +26 -0
- data/fixtures/battle_sim_objects.yml +101 -0
- data/fixtures/corridors.yml +24 -0
- data/fixtures/elf_rogue.yml +39 -0
- data/fixtures/halfling_rogue.yml +41 -0
- data/fixtures/high_elf_fighter.yml +49 -0
- data/fixtures/human_fighter.yml +48 -0
- data/fixtures/path_finding_test.yml +11 -0
- data/fixtures/path_finding_test_2.yml +15 -0
- data/fixtures/path_finding_test_3.yml +26 -0
- data/fixtures/thin_walls.yml +53 -0
- data/fixtures/traps.yml +25 -0
- data/game.yml +20 -0
- data/items/equipment.yml +101 -0
- data/items/objects.yml +73 -0
- data/items/weapons.yml +297 -0
- data/lib/natural_20.rb +68 -0
- data/lib/natural_20/actions/action.rb +40 -0
- data/lib/natural_20/actions/attack_action.rb +372 -0
- data/lib/natural_20/actions/concerns/action_damage.rb +14 -0
- data/lib/natural_20/actions/dash_action.rb +46 -0
- data/lib/natural_20/actions/disengage_action.rb +53 -0
- data/lib/natural_20/actions/dodge_action.rb +45 -0
- data/lib/natural_20/actions/escape_grapple_action.rb +97 -0
- data/lib/natural_20/actions/first_aid_action.rb +109 -0
- data/lib/natural_20/actions/grapple_action.rb +185 -0
- data/lib/natural_20/actions/ground_interact_action.rb +74 -0
- data/lib/natural_20/actions/help_action.rb +56 -0
- data/lib/natural_20/actions/hide_action.rb +53 -0
- data/lib/natural_20/actions/interact_action.rb +91 -0
- data/lib/natural_20/actions/inventory_action.rb +23 -0
- data/lib/natural_20/actions/look_action.rb +63 -0
- data/lib/natural_20/actions/move_action.rb +254 -0
- data/lib/natural_20/actions/multiattack_action.rb +41 -0
- data/lib/natural_20/actions/prone_action.rb +38 -0
- data/lib/natural_20/actions/short_rest_action.rb +53 -0
- data/lib/natural_20/actions/shove_action.rb +142 -0
- data/lib/natural_20/actions/stand_action.rb +47 -0
- data/lib/natural_20/actions/use_item_action.rb +57 -0
- data/lib/natural_20/ai_controller/path_compute.rb +140 -0
- data/lib/natural_20/ai_controller/standard.rb +288 -0
- data/lib/natural_20/battle.rb +544 -0
- data/lib/natural_20/battle_map.rb +843 -0
- data/lib/natural_20/cli/builder/fighter_builder.rb +104 -0
- data/lib/natural_20/cli/builder/rogue_builder.rb +62 -0
- data/lib/natural_20/cli/character_builder.rb +210 -0
- data/lib/natural_20/cli/commandline_ui.rb +612 -0
- data/lib/natural_20/cli/inventory_ui.rb +136 -0
- data/lib/natural_20/cli/map_renderer.rb +165 -0
- data/lib/natural_20/concerns/container.rb +32 -0
- data/lib/natural_20/concerns/entity.rb +1213 -0
- data/lib/natural_20/concerns/evaluator/entity_state_evaluator.rb +59 -0
- data/lib/natural_20/concerns/fighter_actions/second_wind_action.rb +51 -0
- data/lib/natural_20/concerns/fighter_class.rb +35 -0
- data/lib/natural_20/concerns/health_flavor.rb +27 -0
- data/lib/natural_20/concerns/lootable.rb +94 -0
- data/lib/natural_20/concerns/movement_helper.rb +195 -0
- data/lib/natural_20/concerns/multiattack.rb +54 -0
- data/lib/natural_20/concerns/navigation.rb +87 -0
- data/lib/natural_20/concerns/notable.rb +37 -0
- data/lib/natural_20/concerns/rogue_class.rb +26 -0
- data/lib/natural_20/controller.rb +11 -0
- data/lib/natural_20/die_roll.rb +331 -0
- data/lib/natural_20/event_manager.rb +288 -0
- data/lib/natural_20/item_library/base_item.rb +27 -0
- data/lib/natural_20/item_library/chest.rb +230 -0
- data/lib/natural_20/item_library/door_object.rb +189 -0
- data/lib/natural_20/item_library/ground.rb +124 -0
- data/lib/natural_20/item_library/healing_potion.rb +51 -0
- data/lib/natural_20/item_library/object.rb +153 -0
- data/lib/natural_20/item_library/pit_trap.rb +69 -0
- data/lib/natural_20/item_library/stone_wall.rb +18 -0
- data/lib/natural_20/npc.rb +173 -0
- data/lib/natural_20/player_character.rb +414 -0
- data/lib/natural_20/session.rb +168 -0
- data/lib/natural_20/utils/cover.rb +35 -0
- data/lib/natural_20/utils/ray_tracer.rb +90 -0
- data/lib/natural_20/utils/static_light_builder.rb +72 -0
- data/lib/natural_20/utils/weapons.rb +78 -0
- data/lib/natural_20/version.rb +4 -0
- data/locales/en.yml +304 -0
- data/maps/game_map.yml +168 -0
- data/natural_20.gemspec +46 -0
- data/npcs/goblin.yml +64 -0
- data/npcs/human_guard.yml +48 -0
- data/npcs/ogre.yml +61 -0
- data/npcs/owlbear.yml +55 -0
- data/npcs/wolf.yml +46 -0
- data/races/elf.yml +44 -0
- data/races/halfling.yml +22 -0
- data/races/human.yml +13 -0
- metadata +373 -0
@@ -0,0 +1,189 @@
|
|
1
|
+
# typed: false
|
2
|
+
module ItemLibrary
|
3
|
+
class DoorObject < Object
|
4
|
+
attr_reader :state, :locked, :key_name
|
5
|
+
|
6
|
+
def opaque?
|
7
|
+
closed? && !dead?
|
8
|
+
end
|
9
|
+
|
10
|
+
def unlock!
|
11
|
+
@locked = false
|
12
|
+
end
|
13
|
+
|
14
|
+
def lock!
|
15
|
+
@locked = true
|
16
|
+
end
|
17
|
+
|
18
|
+
def locked?
|
19
|
+
@locked
|
20
|
+
end
|
21
|
+
|
22
|
+
def passable?
|
23
|
+
opened? || dead?
|
24
|
+
end
|
25
|
+
|
26
|
+
def closed?
|
27
|
+
@state == :closed
|
28
|
+
end
|
29
|
+
|
30
|
+
def opened?
|
31
|
+
@state == :opened
|
32
|
+
end
|
33
|
+
|
34
|
+
def open!
|
35
|
+
@state = :opened
|
36
|
+
end
|
37
|
+
|
38
|
+
def close!
|
39
|
+
@state = :closed
|
40
|
+
end
|
41
|
+
|
42
|
+
def token
|
43
|
+
return '`' if dead?
|
44
|
+
|
45
|
+
pos_x, pos_y = position
|
46
|
+
t = if map.wall?(pos_x - 1, pos_y) || map.wall?(pos_x + 1, pos_y)
|
47
|
+
opened? ? '-' : '='
|
48
|
+
else
|
49
|
+
opened? ? '|' : '║'
|
50
|
+
end
|
51
|
+
|
52
|
+
[t]
|
53
|
+
end
|
54
|
+
|
55
|
+
def token_opened
|
56
|
+
@properties[:token_open].presence || '-'
|
57
|
+
end
|
58
|
+
|
59
|
+
def token_closed
|
60
|
+
@properties[:token_closed].presence || '='
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns available interaction with this object
|
64
|
+
# @param entity [Natural20::PlayerCharacter]
|
65
|
+
# @return [Array]
|
66
|
+
def available_interactions(entity, battle = nil)
|
67
|
+
interaction_actions = {}
|
68
|
+
if locked?
|
69
|
+
interaction_actions[:unlock] = { disabled: !entity.item_count(:"#{key_name}").positive?,
|
70
|
+
disabled_text: t('object.door.key_required') }
|
71
|
+
if entity.item_count('thieves_tools').positive? && entity.proficient?('thieves_tools')
|
72
|
+
interaction_actions[:lockpick] =
|
73
|
+
{ disabled: !entity.action?(battle), disabled_text: t('object.door.action_required') }
|
74
|
+
end
|
75
|
+
return interaction_actions
|
76
|
+
end
|
77
|
+
|
78
|
+
if opened?
|
79
|
+
{ close: { disabled: someone_blocking_the_doorway?, disabled_text: t('object.door.door_blocked') } }
|
80
|
+
else
|
81
|
+
{ open: {}, lock: { disabled: !entity.item_count(:"#{key_name}").positive?,
|
82
|
+
disabled_text: t('object.door.key_required') } }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def interactable?
|
87
|
+
true
|
88
|
+
end
|
89
|
+
|
90
|
+
# @param entity [Natural20::Entity]
|
91
|
+
# @param action [InteractAction]
|
92
|
+
def resolve(entity, action, _other_params, opts = {})
|
93
|
+
return if action.nil?
|
94
|
+
|
95
|
+
case action
|
96
|
+
when :open
|
97
|
+
if !locked?
|
98
|
+
{
|
99
|
+
action: action
|
100
|
+
}
|
101
|
+
else
|
102
|
+
{
|
103
|
+
action: :door_locked
|
104
|
+
}
|
105
|
+
end
|
106
|
+
when :close
|
107
|
+
{
|
108
|
+
action: action
|
109
|
+
}
|
110
|
+
when :lockpick
|
111
|
+
lock_pick_roll = entity.lockpick!(opts[:battle])
|
112
|
+
|
113
|
+
if lock_pick_roll.result >= lockpick_dc
|
114
|
+
{ action: :lockpick_success, roll: lock_pick_roll, cost: :action }
|
115
|
+
else
|
116
|
+
{ action: :lockpick_fail, roll: lock_pick_roll, cost: :action }
|
117
|
+
end
|
118
|
+
when :unlock
|
119
|
+
entity.item_count(:"#{key_name}").positive? ? { action: :unlock } : { action: :unlock_failed }
|
120
|
+
when :lock
|
121
|
+
entity.item_count(:"#{key_name}").positive? ? { action: :lock } : { action: :lock_failed }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# @param entity [Natural20::Entity]
|
126
|
+
# @param result [Hash]
|
127
|
+
def use!(entity, result)
|
128
|
+
case (result[:action])
|
129
|
+
when :open
|
130
|
+
open! if closed?
|
131
|
+
when :close
|
132
|
+
return unless opened?
|
133
|
+
|
134
|
+
if someone_blocking_the_doorway?
|
135
|
+
return Natural20::EventManager.received_event(source: self, user: entity, event: :object_interaction,
|
136
|
+
sub_type: :close_failed, result: :failed, reason: 'Cannot close door since something is in the doorway')
|
137
|
+
end
|
138
|
+
|
139
|
+
close!
|
140
|
+
when :lockpick_success
|
141
|
+
return unless locked?
|
142
|
+
|
143
|
+
unlock!
|
144
|
+
Natural20::EventManager.received_event(source: self, user: entity, event: :object_interaction,
|
145
|
+
sub_type: :unlock, result: :success, lockpick: true, roll: result[:roll], reason: 'Door unlocked using lockpick.')
|
146
|
+
when :lockpick_fail
|
147
|
+
entity.deduct_item('thieves_tools')
|
148
|
+
Natural20::EventManager.received_event(source: self, user: entity, event: :object_interaction,
|
149
|
+
sub_type: :unlock, result: :failed, roll: result[:roll], reason: 'Lockpicking failed and the theives tools are now broken')
|
150
|
+
when :unlock
|
151
|
+
return unless locked?
|
152
|
+
|
153
|
+
unlock!
|
154
|
+
Natural20::EventManager.received_event(source: self, user: entity, event: :object_interaction,
|
155
|
+
sub_type: :unlock, result: :success, reason: t('object.door.unlock'))
|
156
|
+
when :lock
|
157
|
+
return unless unlocked?
|
158
|
+
|
159
|
+
lock!
|
160
|
+
Natural20::EventManager.received_event(source: self, user: entity, event: :object_interaction,
|
161
|
+
sub_type: :lock, result: :success, reason: t('object.door.lock'))
|
162
|
+
when :door_locked
|
163
|
+
Natural20::EventManager.received_event(source: self, user: entity, event: :object_interaction,
|
164
|
+
sub_type: :open_failed, result: :failed, reason: 'Cannot open door since door is locked.')
|
165
|
+
when :unlock_failed
|
166
|
+
Natural20::EventManager.received_event(source: self, user: entity, event: :object_interaction,
|
167
|
+
sub_type: :unlock_failed, result: :failed, reason: 'Correct Key missing.')
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def lockpick_dc
|
172
|
+
(@properties[:lockpick_dc].presence || 10)
|
173
|
+
end
|
174
|
+
|
175
|
+
protected
|
176
|
+
|
177
|
+
def someone_blocking_the_doorway?
|
178
|
+
!!map.entity_at(*position)
|
179
|
+
end
|
180
|
+
|
181
|
+
def on_take_damage(battle, damage_params); end
|
182
|
+
|
183
|
+
def setup_other_attributes
|
184
|
+
@state = @properties[:state]&.to_sym || :closed
|
185
|
+
@locked = @properties[:locked]
|
186
|
+
@key_name = @properties[:key]
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# typed: false
|
2
|
+
module ItemLibrary
|
3
|
+
class Ground < Object
|
4
|
+
include Natural20::Container
|
5
|
+
|
6
|
+
attr_reader :state, :locked, :key_name
|
7
|
+
|
8
|
+
# Builds a custom UI map
|
9
|
+
# @param action [Symbol] The item specific action
|
10
|
+
# @param action_object [InteractAction]
|
11
|
+
# @return [OpenStruct]
|
12
|
+
def build_map(action, action_object)
|
13
|
+
case action
|
14
|
+
when :drop
|
15
|
+
OpenStruct.new({
|
16
|
+
action: action_object,
|
17
|
+
param: [
|
18
|
+
{
|
19
|
+
type: :select_items,
|
20
|
+
label: action_object.source.items_label,
|
21
|
+
items: action_object.source.inventory
|
22
|
+
}
|
23
|
+
],
|
24
|
+
next: lambda { |items|
|
25
|
+
action_object.other_params = items
|
26
|
+
OpenStruct.new({
|
27
|
+
param: nil,
|
28
|
+
next: lambda {
|
29
|
+
action_object
|
30
|
+
}
|
31
|
+
})
|
32
|
+
}
|
33
|
+
})
|
34
|
+
when :pickup
|
35
|
+
OpenStruct.new({
|
36
|
+
action: action_object,
|
37
|
+
param: [
|
38
|
+
{
|
39
|
+
type: :select_items,
|
40
|
+
label: items_label,
|
41
|
+
items: inventory
|
42
|
+
}
|
43
|
+
],
|
44
|
+
next: lambda { |items|
|
45
|
+
action_object.other_params = items
|
46
|
+
OpenStruct.new({
|
47
|
+
param: nil,
|
48
|
+
next: lambda {
|
49
|
+
action_object
|
50
|
+
}
|
51
|
+
})
|
52
|
+
}
|
53
|
+
})
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def opaque?
|
58
|
+
false
|
59
|
+
end
|
60
|
+
|
61
|
+
def passable?
|
62
|
+
true
|
63
|
+
end
|
64
|
+
|
65
|
+
def placeable?
|
66
|
+
true
|
67
|
+
end
|
68
|
+
|
69
|
+
def token
|
70
|
+
["\u00B7".encode('utf-8')]
|
71
|
+
end
|
72
|
+
|
73
|
+
def color
|
74
|
+
:cyan
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns available interaction with this object
|
78
|
+
# @param entity [Natural20::PlayerCharacter]
|
79
|
+
# @return [Array]
|
80
|
+
def available_interactions(_entity, _battle = nil)
|
81
|
+
[]
|
82
|
+
end
|
83
|
+
|
84
|
+
def interactable?
|
85
|
+
false
|
86
|
+
end
|
87
|
+
|
88
|
+
# @param entity [Natural20::Entity]
|
89
|
+
# @param action [InteractAction]
|
90
|
+
def resolve(entity, action, other_params, opts = {})
|
91
|
+
return if action.nil?
|
92
|
+
|
93
|
+
case action
|
94
|
+
when :drop, :pickup
|
95
|
+
{ action: action, items: other_params, source: entity, target: self, battle: opts[:battle] }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# @param entity [Natural20::Entity]
|
100
|
+
# @param result [Hash]
|
101
|
+
def use!(_entity, result)
|
102
|
+
case result[:action]
|
103
|
+
when :drop
|
104
|
+
store(result[:battle], result[:source], result[:target], result[:items])
|
105
|
+
when :pickup
|
106
|
+
retrieve(result[:battle], result[:source], result[:target], result[:items])
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def list_notes(_entity, _perception, highlight: false)
|
111
|
+
inventory.map do |_item|
|
112
|
+
t("object.#{m.label}", default: m.label)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
protected
|
117
|
+
|
118
|
+
def on_take_damage(battle, damage_params); end
|
119
|
+
|
120
|
+
def setup_other_attributes
|
121
|
+
@inventory = {}
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# typed: true
|
2
|
+
module ItemLibrary
|
3
|
+
class HealingPotion < BaseItem
|
4
|
+
def build_map(action)
|
5
|
+
OpenStruct.new({
|
6
|
+
param: [
|
7
|
+
{
|
8
|
+
type: :select_target,
|
9
|
+
num: 1,
|
10
|
+
range: 5,
|
11
|
+
target_types: %i[allies self]
|
12
|
+
}
|
13
|
+
],
|
14
|
+
next: lambda { |target|
|
15
|
+
action.target = target
|
16
|
+
OpenStruct.new({
|
17
|
+
param: nil,
|
18
|
+
next: lambda {
|
19
|
+
action
|
20
|
+
}
|
21
|
+
})
|
22
|
+
}
|
23
|
+
})
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(name, properties)
|
27
|
+
@name = name
|
28
|
+
@properties = properties
|
29
|
+
end
|
30
|
+
|
31
|
+
def consumable?
|
32
|
+
@properties[:consumable]
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param entity [Natural20::Entity]
|
36
|
+
# @param battle [Natrual20::Battle]
|
37
|
+
def resolve(entity, battle)
|
38
|
+
hp_regain_roll = Natural20::DieRoll.roll(@properties[:hp_regained], description: t('dice_roll.healing_potion'),
|
39
|
+
entity: entity,
|
40
|
+
battle: battle)
|
41
|
+
|
42
|
+
{
|
43
|
+
hp_gain_roll: hp_regain_roll
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
def use!(entity, result)
|
48
|
+
entity.heal!(result[:hp_gain_roll].result)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# typed: true
|
2
|
+
module ItemLibrary
|
3
|
+
module AreaTrigger
|
4
|
+
def area_trigger_handler(_entity, _entity_pos, is_flying); end
|
5
|
+
end
|
6
|
+
|
7
|
+
class Object
|
8
|
+
class InvalidInteractionAction < StandardError
|
9
|
+
attr_reader :action, :valid_actions
|
10
|
+
|
11
|
+
# @param action [Symbol]
|
12
|
+
# @param valid_actions [Array]
|
13
|
+
def initialize(action, valid_actions = [])
|
14
|
+
@action = action
|
15
|
+
@valid_actions = valid_actions
|
16
|
+
end
|
17
|
+
|
18
|
+
def message
|
19
|
+
"Invalid action specified #{action}. should be in #{valid_actions.join(',')}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
include Natural20::Entity
|
24
|
+
include Natural20::Notable
|
25
|
+
|
26
|
+
attr_accessor :hp, :statuses, :resistances, :name, :map
|
27
|
+
|
28
|
+
def initialize(map, properties)
|
29
|
+
@name = properties[:name]
|
30
|
+
@map = map
|
31
|
+
@session = map.session
|
32
|
+
@statuses = Set.new
|
33
|
+
@properties = properties
|
34
|
+
@resistances = properties[:resistances].presence || []
|
35
|
+
setup_other_attributes
|
36
|
+
@hp = if !properties[:hp_die].blank?
|
37
|
+
Natural20::DieRoll.roll(properties[:hp_die]).result
|
38
|
+
else
|
39
|
+
properties[:max_hp]
|
40
|
+
end
|
41
|
+
if @properties[:inventory]
|
42
|
+
@inventory = @properties[:inventory].map do |inventory|
|
43
|
+
[inventory[:type].to_sym, OpenStruct.new({ qty: inventory[:qty] })]
|
44
|
+
end.to_h
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def name
|
49
|
+
@properties[:label] || @name
|
50
|
+
end
|
51
|
+
|
52
|
+
def label
|
53
|
+
@properties[:label] || name
|
54
|
+
end
|
55
|
+
|
56
|
+
def position
|
57
|
+
map.position_of(self)
|
58
|
+
end
|
59
|
+
|
60
|
+
def color
|
61
|
+
@properties[:color]
|
62
|
+
end
|
63
|
+
|
64
|
+
def armor_class
|
65
|
+
@properties[:default_ac]
|
66
|
+
end
|
67
|
+
|
68
|
+
def opaque?
|
69
|
+
@properties[:opaque]
|
70
|
+
end
|
71
|
+
|
72
|
+
def half_cover?
|
73
|
+
@properties[:cover] == 'half'
|
74
|
+
end
|
75
|
+
|
76
|
+
def three_quarter_cover?
|
77
|
+
@properties[:cover] == 'three_quarter'
|
78
|
+
end
|
79
|
+
|
80
|
+
def total_cover?
|
81
|
+
@properties[:cover] == 'total'
|
82
|
+
end
|
83
|
+
|
84
|
+
def interactable?
|
85
|
+
false
|
86
|
+
end
|
87
|
+
|
88
|
+
def placeable?
|
89
|
+
@properties.key?(:placeable) ? @properties[:placeable] : true
|
90
|
+
end
|
91
|
+
|
92
|
+
def movement_cost
|
93
|
+
@properties[:movement_cost] || 1
|
94
|
+
end
|
95
|
+
|
96
|
+
def token
|
97
|
+
@properties[:token]
|
98
|
+
end
|
99
|
+
|
100
|
+
def size
|
101
|
+
@properties[:size] || :medium
|
102
|
+
end
|
103
|
+
|
104
|
+
def available_interactions(_entity, _battle)
|
105
|
+
[]
|
106
|
+
end
|
107
|
+
|
108
|
+
def light_properties
|
109
|
+
@properties[:light]
|
110
|
+
end
|
111
|
+
|
112
|
+
# This terrain needs to be jumped over for movement
|
113
|
+
def jump_required?
|
114
|
+
@properties[:jump]
|
115
|
+
end
|
116
|
+
|
117
|
+
def passable?
|
118
|
+
@properties[:passable]
|
119
|
+
end
|
120
|
+
|
121
|
+
def wall?
|
122
|
+
@properties[:wall]
|
123
|
+
end
|
124
|
+
|
125
|
+
def concealed?
|
126
|
+
false
|
127
|
+
end
|
128
|
+
|
129
|
+
def describe_health
|
130
|
+
''
|
131
|
+
end
|
132
|
+
|
133
|
+
def object?
|
134
|
+
true
|
135
|
+
end
|
136
|
+
|
137
|
+
def npc?
|
138
|
+
false
|
139
|
+
end
|
140
|
+
|
141
|
+
def pc?
|
142
|
+
false
|
143
|
+
end
|
144
|
+
|
145
|
+
def items_label
|
146
|
+
I18n.t(:"object.#{self.class}.item_label", default: "#{name} Items")
|
147
|
+
end
|
148
|
+
|
149
|
+
protected
|
150
|
+
|
151
|
+
def setup_other_attributes; end
|
152
|
+
end
|
153
|
+
end
|