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 +4 -4
- data/amar-tui.rb +1 -1
- data/cli_npc_output_new.rb +59 -18
- data/includes/class_npc_new.rb +92 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bdc61cf6d9ff6b07fc95dfc822d63a5bca306892ce47e6f9dd6dd81333d0f7e
|
4
|
+
data.tar.gz: 7727d43ea06e90644243c5285c5377606e858ce720692d47412d2a6a61061aaf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 244dc76fd72a90221b996a45c4d34b2c277974578c3adf2decff59c12bb80d75d1673fd10d41a30868debb0ba51795682310a8a738406ed796e8385196cc7a60
|
7
|
+
data.tar.gz: fad7b596d3c51a13c850adea69c5f497cd55e46768bb4955b84cac7f2a95277b5411349878cae45a0e29464574ae075a8fd003c7a33e7a89264356005ffa70a8
|
data/amar-tui.rb
CHANGED
data/cli_npc_output_new.rb
CHANGED
@@ -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 |
|
296
|
-
|
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
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
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 += "#{
|
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 |
|
319
|
-
|
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
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
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 += "#{
|
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)}"
|
data/includes/class_npc_new.rb
CHANGED
@@ -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.
|
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.
|
126
|
+
AMAR RPG Tools v2.1.2 has been installed!
|
127
127
|
===========================================
|
128
128
|
|
129
129
|
To start the application:
|