dd-next-encounters 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e5af6e145531520e7e13269f87fb25dc99bf22a8
4
- data.tar.gz: 25e866bbe044c3e96d6f2fbe53687b89efc443f5
3
+ metadata.gz: 0c439e67e42a41fce80b6270a542ace5aa2bafac
4
+ data.tar.gz: d80a2449e59c665156a29747266fa99a306b6d27
5
5
  SHA512:
6
- metadata.gz: cd1d9d7110ea8b8b870e9e1b203740b244172d6f26baccdb5eb2d698383828802752103e705a302d8d723a8ed416c25db1aa241644a175c043f3b1d8b9c6ca0f
7
- data.tar.gz: 045fc1947d8d44e4ad67f21951cc4038759d1a4a62076550ff6cd2d21a2cabf7a76aa2d6609f34af2ef09e61c50b8d546442513bcc5f1a75c83ddd9d93d6c2ab
6
+ metadata.gz: 03ad46f247684c9aec0beaf7edb965cb56bff71b25c7a72fe08cec84fa4ff6e9bdcab0e4d5b845a72e5747c3df02320f3637aae489a4c6dc540aeec232df56d5
7
+ data.tar.gz: 218ce8c5e23c06376319d19165e31ede9ad4f65404bac2075e0a304e16ac5bc52d533f6cab5b783c6bc0bf6d02fcdf9fb099af5de31c929844c34fd660c2da8e
@@ -6,7 +6,8 @@ class Encounter
6
6
  end
7
7
 
8
8
  # Return true or false. Monster added or not
9
- def add_monster_if_possible( monster )
9
+ def add_monster_while_possible(monster )
10
+ raise "monster can't be nil : #{monster.inspect}" unless monster
10
11
  if can_add_monster?( monster )
11
12
  @monsters << monster
12
13
  return true
@@ -25,6 +26,7 @@ class Encounter
25
26
  private
26
27
 
27
28
  def encounter_value( encounter )
29
+ raise "Encounter should not contain nil values : #{encounter.inspect}" if encounter.compact != encounter
28
30
  encounter.map{ |e| e.xp_value }.reduce(&:+) * get_encounter_multiplier( encounter )
29
31
  end
30
32
 
@@ -26,27 +26,49 @@ class Lair
26
26
 
27
27
  # encounter_level : :easy, :medium, :hard, :deadly
28
28
  def get_encounter( encounter_level, *hero_level )
29
+ raise 'Empty party is not valid. Please provide at least one hero' if hero_level.empty?
29
30
  @monster_manual.validate_loaded
30
31
 
31
32
  raise "Bad encounter level : #{encounter_level.inspect}. Available encounter level : #{AVAILABLE_ENCOUNTER_LEVEL.inspect}" unless AVAILABLE_ENCOUNTER_LEVEL.include?( encounter_level )
32
- party_xp_level = hero_level.map{ |hl| @xp_difficulty_table[hl][encounter_level] }.reduce(&:+)
33
+ raise 'Party too weak. Minimum 3 members' if hero_level.count < 3
34
+
35
+ hero_level.each do |level|
36
+ raise "Bad hero level : #{level}. Should be between 1 .. 20" if level < 1 || level > 20
37
+ end
33
38
 
34
- encounter = Encounter.new( party_xp_level )
39
+ party_xp_level = hero_level.map{ |hl| @xp_difficulty_table[hl][encounter_level] }.reduce(&:+)
35
40
 
36
- # Choose a random encounter type
37
- encounter_type = @encounters_types.sample
38
- bosses = @encounters[encounter_type][:bosses]
39
- troops = @encounters[encounter_type][:troops]
41
+ tested_encounters_types = []
42
+ encounter = nil
43
+ loop do
40
44
 
41
- # Choose a random boss
42
- boss = bosses.sample if !bosses.empty? && rand( 1 .. 2 ) == 1
43
- encounter.add_monster_if_possible( boss ) if boss
45
+ raise "Can't create an encounter for this party" if (@encounters_types-tested_encounters_types).empty?
46
+ encounter = Encounter.new( party_xp_level )
47
+
48
+ # Choose a random encounter type
49
+ encounter_type = ( @encounters_types - tested_encounters_types ).sample
50
+ bosses = @encounters[encounter_type][:bosses]
51
+ troops = @encounters[encounter_type][:troops]
52
+
53
+ # Choose a random boss
54
+ boss = bosses.sample if !bosses.empty? && rand( 1 .. 2 ) == 1
55
+ encounter.add_monster_while_possible(boss ) if boss
56
+
57
+ # Choose a random monster
58
+ monster = get_corresponding_monsters( troops, party_xp_level ).sample
59
+ # We couldn't get a monster of this type for this party. Probably the monsters are too hard
60
+ # Then we have to check again with another monster type
61
+ unless monster
62
+ tested_encounters_types << encounter_type
63
+ next
64
+ end
44
65
 
45
- # Choose a random monster
46
- monster = get_corresponding_monsters( troops, party_xp_level ).sample
66
+ # Will add the same monster while party_xp_level is not reached
67
+ loop do
68
+ break unless encounter.add_monster_while_possible(monster )
69
+ end
47
70
 
48
- loop do
49
- break unless encounter.add_monster_if_possible( monster )
71
+ break
50
72
  end
51
73
 
52
74
  encounter
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dd-next-encounters
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cédric Zuger