amar-rpg 2.1.0 → 2.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 536b86190b86f88e7cf0fbcb996b3777d763db1355cf7d00c5888ace8215cae5
4
- data.tar.gz: 2e5b19fc161bc0075360119726e8ae7ff6afcdf845569400276e4015fea4b536
3
+ metadata.gz: 2bdc61cf6d9ff6b07fc95dfc822d63a5bca306892ce47e6f9dd6dd81333d0f7e
4
+ data.tar.gz: 7727d43ea06e90644243c5285c5377606e858ce720692d47412d2a6a61061aaf
5
5
  SHA512:
6
- metadata.gz: 15600fb55d0b19e8b27cdde1714f33d94fb9a2129b41017241a158c3d4346a3b1418bcd6361905394c6b0daaca433b32395a65469ebbf0207ff37f3f73c23b57
7
- data.tar.gz: ded060cb9604355162869df99af628daa0e51f4bba38178d092579ce9776e5807d3d488e11280f993db53fd1978e2132e59a1a6d46b3459db84ff61e6ddbc36f
6
+ metadata.gz: 244dc76fd72a90221b996a45c4d34b2c277974578c3adf2decff59c12bb80d75d1673fd10d41a30868debb0ba51795682310a8a738406ed796e8385196cc7a60
7
+ data.tar.gz: fad7b596d3c51a13c850adea69c5f497cd55e46768bb4955b84cac7f2a95277b5411349878cae45a0e29464574ae075a8fd003c7a33e7a89264356005ffa70a8
data/amar-tui.rb CHANGED
@@ -60,7 +60,7 @@ require 'stringio' # For suppressing output
60
60
  require 'fcntl' # For non-blocking IO
61
61
 
62
62
  # GLOBAL VARS & CONSTANTS
63
- @version = "2.1.0"
63
+ @version = "2.1.2"
64
64
  $pgmdir = File.dirname(__FILE__) # Global for includes
65
65
 
66
66
  # Debug logging
@@ -274,11 +274,21 @@ def npc_output_new(n, cli, custom_width = nil)
274
274
  f += "\n"
275
275
  end
276
276
  else
277
- # 3-tier weapon display - show ALL weapon skills
277
+ # 3-tier weapon display - show ALL weapon skills with actual weapon names
278
278
  melee_weapons = n.tiers["BODY"]["Melee Combat"]["skills"].select { |_, v| v > 0 } rescue {}
279
279
  missile_weapons = n.tiers["BODY"]["Missile Combat"]["skills"].select { |_, v| v > 0 } rescue {}
280
+ actual_melee = n.tiers["BODY"]["Melee Combat"]["actual_weapons"] rescue {}
281
+ actual_missile = n.tiers["BODY"]["Missile Combat"]["actual_weapons"] rescue {}
280
282
 
281
283
  if melee_weapons.any? || missile_weapons.any?
284
+ # Load weapon tables for stats lookup
285
+ unless defined?($Melee)
286
+ load File.join($pgmdir, "includes/tables/melee.rb")
287
+ end
288
+ unless defined?($Missile)
289
+ load File.join($pgmdir, "includes/tables/missile.rb")
290
+ end
291
+
282
292
  f += "─" * width + "\n"
283
293
  f += "#{@weapon_color}WEAPON SKILL INI OFF DEF DAM HP RANGE#{@reset}\n"
284
294
 
@@ -292,19 +302,35 @@ def npc_output_new(n, cli, custom_width = nil)
292
302
  reaction_speed = n.get_skill_total("MIND", "Awareness", "Reaction speed") || 0
293
303
 
294
304
  # Display melee weapons
295
- melee_weapons.sort_by { |_, skill| -skill }.each do |weapon, skill|
296
- wpn_stats = get_weapon_stats(weapon)
305
+ melee_weapons.sort_by { |_, skill| -skill }.each do |weapon_skill, skill|
306
+ # Get actual weapon name
307
+ actual_weapon_name = actual_melee[weapon_skill] || weapon_skill
308
+
309
+ # Find weapon in $Melee table
310
+ weapon_data = $Melee.find { |w| w && w[0] && w[0].strip == actual_weapon_name.strip }
311
+
297
312
  attr = n.get_attribute("BODY", "Melee Combat") || 0
298
313
  skill_total = body_char + attr + skill
299
314
 
300
- init = reaction_speed + (wpn_stats[:init] || 0)
301
- off = skill_total + (wpn_stats[:off] || 0)
302
- defense = skill_total + (wpn_stats[:def] || 0) + dodge_bonus
303
- dmg_mod = wpn_stats[:dmg].to_s =~ /special/ ? 0 : (wpn_stats[:dmg].to_s.to_i || 0)
304
- dmg = (n.DB || 0) + dmg_mod
305
- hp = wpn_stats[:hp] || 0
315
+ if weapon_data
316
+ # Use actual weapon stats from table: [Name, Type, Str, Dam, Init, Off, Def, HP, Wt]
317
+ init = reaction_speed + weapon_data[4]
318
+ off = skill_total + weapon_data[5]
319
+ defense = skill_total + weapon_data[6] + dodge_bonus
320
+ dmg = (n.DB || 0) + weapon_data[3]
321
+ hp = weapon_data[7]
322
+ else
323
+ # Fallback to pattern matching
324
+ wpn_stats = get_weapon_stats(actual_weapon_name)
325
+ init = reaction_speed + (wpn_stats[:init] || 0)
326
+ off = skill_total + (wpn_stats[:off] || 0)
327
+ defense = skill_total + (wpn_stats[:def] || 0) + dodge_bonus
328
+ dmg_mod = wpn_stats[:dmg].to_s =~ /special/ ? 0 : (wpn_stats[:dmg].to_s.to_i || 0)
329
+ dmg = (n.DB || 0) + dmg_mod
330
+ hp = wpn_stats[:hp] || 0
331
+ end
306
332
 
307
- f += "#{weapon.ljust(19)}"
333
+ f += "#{actual_weapon_name.ljust(19)}"
308
334
  f += "#{skill_total.to_s.ljust(9)}"
309
335
  f += "#{init.to_s.ljust(8)}"
310
336
  f += "#{off.to_s.ljust(7)}"
@@ -315,18 +341,33 @@ def npc_output_new(n, cli, custom_width = nil)
315
341
  end
316
342
 
317
343
  # Display missile weapons
318
- missile_weapons.sort_by { |_, skill| -skill }.each do |weapon, skill|
319
- wpn_stats = get_missile_stats(weapon)
344
+ missile_weapons.sort_by { |_, skill| -skill }.each do |weapon_skill, skill|
345
+ # Get actual weapon name
346
+ actual_weapon_name = actual_missile[weapon_skill] || weapon_skill
347
+
348
+ # Find weapon in $Missile table
349
+ weapon_data = $Missile.find { |w| w && w[0] && w[0].strip == actual_weapon_name.strip }
350
+
320
351
  attr = n.get_attribute("BODY", "Missile Combat") || 0
321
352
  skill_total = body_char + attr + skill
322
353
 
323
- off = skill_total + (wpn_stats[:off] || 0)
324
- range = wpn_stats[:range] || "30m"
325
- dmg_mod = wpn_stats[:dmg].to_s =~ /special/ ? 0 : (wpn_stats[:dmg].to_s.to_i || 0)
326
- dmg = (n.DB || 0) + dmg_mod
327
- hp = wpn_stats[:hp] || 0
354
+ if weapon_data
355
+ # Use actual weapon stats from table: [Name, Type, Str, Dam, Off, Rng, Max, Init, Wt]
356
+ off = skill_total + weapon_data[4]
357
+ dmg = (n.DB || 0) + weapon_data[3]
358
+ range = "#{weapon_data[5]}m"
359
+ hp = weapon_data[7]
360
+ else
361
+ # Fallback to pattern matching
362
+ wpn_stats = get_missile_stats(actual_weapon_name)
363
+ off = skill_total + (wpn_stats[:off] || 0)
364
+ range = wpn_stats[:range] || "30m"
365
+ dmg_mod = wpn_stats[:dmg].to_s =~ /special/ ? 0 : (wpn_stats[:dmg].to_s.to_i || 0)
366
+ dmg = (n.DB || 0) + dmg_mod
367
+ hp = wpn_stats[:hp] || 0
368
+ end
328
369
 
329
- f += "#{weapon.ljust(19)}"
370
+ f += "#{actual_weapon_name.ljust(19)}"
330
371
  f += "#{skill_total.to_s.ljust(9)}"
331
372
  f += "#{' '.ljust(8)}" # No init for missile
332
373
  f += "#{off.to_s.ljust(7)}"
@@ -460,14 +460,94 @@ class NpcNew
460
460
  level
461
461
  end
462
462
 
463
+ def select_actual_weapon_from_table(skill_name, strength_char, is_missile = false)
464
+ # Select actual weapon from $Melee or $Missile table based on skill and strength
465
+ # This mimics the original weapon selection system
466
+ unless defined?($Melee)
467
+ load File.join($pgmdir, "includes/tables/melee.rb")
468
+ end
469
+ unless defined?($Missile)
470
+ load File.join($pgmdir, "includes/tables/missile.rb")
471
+ end
472
+
473
+ if is_missile
474
+ # Select from $Missile table based on skill type
475
+ case skill_name.downcase
476
+ when /bow/
477
+ # Select bow based on strength: L(2), M(4), H(6), H2(8), H3(10)
478
+ if strength_char >= 10
479
+ "Bow(H3) [1]"
480
+ elsif strength_char >= 8
481
+ "Bow(H2) [1]"
482
+ elsif strength_char >= 6
483
+ "Bow(H) [1]"
484
+ elsif strength_char >= 4
485
+ "Bow(M) [1]"
486
+ else
487
+ "Bow(L) [1]"
488
+ end
489
+ when /crossbow|x-bow/
490
+ if strength_char >= 4
491
+ "X-bow(H) [¼]"
492
+ elsif strength_char >= 3
493
+ "X-bow(M) [⅓]"
494
+ else
495
+ "X-bow(L) [½]"
496
+ end
497
+ when /throwing/
498
+ "Th Knife [2]"
499
+ when /javelin/
500
+ "Javelin [1]"
501
+ when /sling/
502
+ "Sling [1]"
503
+ when /net/
504
+ "Net"
505
+ when /spear/
506
+ "Javelin [1]"
507
+ else
508
+ "Rock [2]"
509
+ end
510
+ else
511
+ # Select from $Melee table based on Wield Weapon total (replaces old STRENGTH)
512
+ # This is BODY + Strength + Wield weapon skill
513
+ # Determine weapon level range based on Wield Weapon total
514
+ wpn_level = case strength_char
515
+ when 0..1 then 2
516
+ when 2..3 then 4
517
+ when 4..6 then 11
518
+ when 7..9 then 18
519
+ when 10..12 then 22
520
+ when 13..15 then 26
521
+ when 16..18 then 28
522
+ else 30
523
+ end
524
+
525
+ # Select random weapon from available range
526
+ weapon_idx = rand(wpn_level) + 1
527
+ weapon_data = $Melee[weapon_idx]
528
+
529
+ if weapon_data
530
+ weapon_data[0].strip # Return weapon name like "Longsword/Buc"
531
+ else
532
+ skill_name # Fallback to skill name
533
+ end
534
+ end
535
+ end
536
+
463
537
  def add_weapon_skills(template)
464
538
  # Add melee weapon skills with primary weapon specialization
539
+ # Also store actual weapon selections from $Melee/$Missile tables
465
540
  if template["melee_weapons"]
466
541
  @tiers["BODY"]["Melee Combat"]["skills"] ||= {}
542
+ @tiers["BODY"]["Melee Combat"]["actual_weapons"] ||= {}
467
543
 
468
544
  # Find primary weapon (highest base value)
469
545
  primary_weapon = template["melee_weapons"].max_by { |_, v| v }
470
546
 
547
+ # Get Wield Weapon total for weapon table selection (replaces old STRENGTH)
548
+ # This is BODY + Strength + Wield weapon skill
549
+ wield_total = get_skill_total("BODY", "Strength", "Wield weapon") rescue 3
550
+
471
551
  template["melee_weapons"].each_with_index do |(weapon, skill_level), index|
472
552
  base_level = calculate_tier_level(skill_level, @level, 0.6)
473
553
 
@@ -478,16 +558,24 @@ class NpcNew
478
558
  end
479
559
 
480
560
  @tiers["BODY"]["Melee Combat"]["skills"][weapon] = base_level
561
+
562
+ # Select actual weapon from $Melee table based on Wield Weapon total
563
+ actual_weapon = select_actual_weapon_from_table(weapon, wield_total, false)
564
+ @tiers["BODY"]["Melee Combat"]["actual_weapons"][weapon] = actual_weapon
481
565
  end
482
566
  end
483
567
 
484
568
  # Add missile weapon skills
485
569
  if template["missile_weapons"]
486
570
  @tiers["BODY"]["Missile Combat"]["skills"] ||= {}
571
+ @tiers["BODY"]["Missile Combat"]["actual_weapons"] ||= {}
487
572
 
488
573
  # Find primary missile weapon
489
574
  primary_missile = template["missile_weapons"].max_by { |_, v| v }
490
575
 
576
+ # Get Wield Weapon total for missile weapon selection (bow strength requirements)
577
+ wield_total = get_skill_total("BODY", "Strength", "Wield weapon") rescue 3
578
+
491
579
  template["missile_weapons"].each do |weapon, skill_level|
492
580
  base_level = calculate_tier_level(skill_level, @level, 0.6)
493
581
 
@@ -498,6 +586,10 @@ class NpcNew
498
586
  end
499
587
 
500
588
  @tiers["BODY"]["Missile Combat"]["skills"][weapon] = base_level
589
+
590
+ # Select actual weapon based on Wield Weapon total
591
+ actual_weapon = select_actual_weapon_from_table(weapon, wield_total, true)
592
+ @tiers["BODY"]["Missile Combat"]["actual_weapons"][weapon] = actual_weapon
501
593
  end
502
594
  end
503
595
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amar-rpg
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geir Isene
@@ -123,7 +123,7 @@ metadata:
123
123
  post_install_message: |2+
124
124
 
125
125
  ===========================================
126
- AMAR RPG Tools v2.1.0 has been installed!
126
+ AMAR RPG Tools v2.1.2 has been installed!
127
127
  ===========================================
128
128
 
129
129
  To start the application: