amar-rpg 2.1.0 → 2.1.1

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: 58d7a7e1e8688949f6e0beed811aeab31928d09cd6a2c7b602aba9706b617b5d
4
+ data.tar.gz: 776ed77dce45af1ab2d8eb412beebf733e7ba509738c8b7328fe048e32227913
5
5
  SHA512:
6
- metadata.gz: 15600fb55d0b19e8b27cdde1714f33d94fb9a2129b41017241a158c3d4346a3b1418bcd6361905394c6b0daaca433b32395a65469ebbf0207ff37f3f73c23b57
7
- data.tar.gz: ded060cb9604355162869df99af628daa0e51f4bba38178d092579ce9776e5807d3d488e11280f993db53fd1978e2132e59a1a6d46b3459db84ff61e6ddbc36f
6
+ metadata.gz: bc917d0a80ff2b84a2aa2a87196609fc880aeca6f9f267b60492e523c41860bc529af1d73885942c7030c4fed07eb7869dcce7c4a4fd6cf76764babdbd05c1de
7
+ data.tar.gz: c5e7639280c0aa684396b6b669ff0a5d5d0301b16b6c0408f3a3bb2b7409fbb2d0e7eebe0471679cb643d7c3f404bacf78610e854a67ed374356d7bb444e400b
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.1"
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,96 @@ class NpcNew
460
460
  level
461
461
  end
462
462
 
463
+ def select_actual_weapon(skill_name, strength_total, is_missile = false)
464
+ # Map skill name to actual weapon from $Melee or $Missile table
465
+ # Load weapon tables if needed
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
+ # Map missile skill names to actual weapons
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_total >= 10
479
+ "Bow(H3) [1]"
480
+ elsif strength_total >= 8
481
+ "Bow(H2) [1]"
482
+ elsif strength_total >= 6
483
+ "Bow(H) [1]"
484
+ elsif strength_total >= 4
485
+ "Bow(M) [1]"
486
+ else
487
+ "Bow(L) [1]"
488
+ end
489
+ when /crossbow|x-bow/
490
+ # Select crossbow based on strength
491
+ if strength_total >= 4
492
+ "X-bow(H) [¼]"
493
+ elsif strength_total >= 3
494
+ "X-bow(M) [⅓]"
495
+ else
496
+ "X-bow(L) [½]"
497
+ end
498
+ when /throwing|knife/
499
+ "Th Knife [2]"
500
+ when /javelin/
501
+ "Javelin [1]"
502
+ when /sling/
503
+ "Sling [1]"
504
+ when /net/
505
+ skill_name # Net is just "Net"
506
+ when /spear/
507
+ "Javelin [1]" # Thrown spear = javelin
508
+ else
509
+ "Rock [2]" # Default
510
+ end
511
+ else
512
+ # Map melee skill names to actual weapons from $Melee table
513
+ case skill_name.downcase
514
+ when /sword/
515
+ strength_total >= 4 ? "Longsword" : "Short sword"
516
+ when /axe/
517
+ strength_total >= 4 ? "B. axe 2H" : "Hatchet"
518
+ when /spear/
519
+ strength_total >= 4 ? "Spear 2H" : "Spear"
520
+ when /mace/
521
+ strength_total >= 4 ? "H. mace 2H" : "Light mace"
522
+ when /dagger|knife/
523
+ "Knife"
524
+ when /staff/
525
+ "Staff"
526
+ when /club/
527
+ "Club"
528
+ when /net/
529
+ "Net"
530
+ when /shield/
531
+ "Buckler"
532
+ when /unarmed/
533
+ "Unarmed"
534
+ else
535
+ skill_name # Return as-is if no match
536
+ end
537
+ end
538
+ end
539
+
463
540
  def add_weapon_skills(template)
464
541
  # Add melee weapon skills with primary weapon specialization
542
+ # Also store actual weapon selections based on skill names
465
543
  if template["melee_weapons"]
466
544
  @tiers["BODY"]["Melee Combat"]["skills"] ||= {}
545
+ @tiers["BODY"]["Melee Combat"]["actual_weapons"] ||= {}
467
546
 
468
547
  # Find primary weapon (highest base value)
469
548
  primary_weapon = template["melee_weapons"].max_by { |_, v| v }
470
549
 
550
+ # Get strength total for weapon selection
551
+ strength_total = get_skill_total("BODY", "Strength", "Wield weapon") rescue 3
552
+
471
553
  template["melee_weapons"].each_with_index do |(weapon, skill_level), index|
472
554
  base_level = calculate_tier_level(skill_level, @level, 0.6)
473
555
 
@@ -478,16 +560,24 @@ class NpcNew
478
560
  end
479
561
 
480
562
  @tiers["BODY"]["Melee Combat"]["skills"][weapon] = base_level
563
+
564
+ # Select actual weapon based on skill name and strength
565
+ actual_weapon = select_actual_weapon(weapon, strength_total, false)
566
+ @tiers["BODY"]["Melee Combat"]["actual_weapons"][weapon] = actual_weapon
481
567
  end
482
568
  end
483
569
 
484
570
  # Add missile weapon skills
485
571
  if template["missile_weapons"]
486
572
  @tiers["BODY"]["Missile Combat"]["skills"] ||= {}
573
+ @tiers["BODY"]["Missile Combat"]["actual_weapons"] ||= {}
487
574
 
488
575
  # Find primary missile weapon
489
576
  primary_missile = template["missile_weapons"].max_by { |_, v| v }
490
577
 
578
+ # Get strength total for missile weapon selection
579
+ strength_total = get_skill_total("BODY", "Strength", "Wield weapon") rescue 3
580
+
491
581
  template["missile_weapons"].each do |weapon, skill_level|
492
582
  base_level = calculate_tier_level(skill_level, @level, 0.6)
493
583
 
@@ -498,6 +588,10 @@ class NpcNew
498
588
  end
499
589
 
500
590
  @tiers["BODY"]["Missile Combat"]["skills"][weapon] = base_level
591
+
592
+ # Select actual weapon based on skill name and strength
593
+ actual_weapon = select_actual_weapon(weapon, strength_total, true)
594
+ @tiers["BODY"]["Missile Combat"]["actual_weapons"][weapon] = actual_weapon
501
595
  end
502
596
  end
503
597
 
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.1
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.1 has been installed!
127
127
  ===========================================
128
128
 
129
129
  To start the application: