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 +4 -4
- data/amar-tui.rb +1 -1
- data/cli_npc_output_new.rb +59 -18
- data/includes/class_npc_new.rb +94 -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: 58d7a7e1e8688949f6e0beed811aeab31928d09cd6a2c7b602aba9706b617b5d
|
4
|
+
data.tar.gz: 776ed77dce45af1ab2d8eb412beebf733e7ba509738c8b7328fe048e32227913
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc917d0a80ff2b84a2aa2a87196609fc880aeca6f9f267b60492e523c41860bc529af1d73885942c7030c4fed07eb7869dcce7c4a4fd6cf76764babdbd05c1de
|
7
|
+
data.tar.gz: c5e7639280c0aa684396b6b669ff0a5d5d0301b16b6c0408f3a3bb2b7409fbb2d0e7eebe0471679cb643d7c3f404bacf78610e854a67ed374356d7bb444e400b
|
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,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.
|
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.
|
126
|
+
AMAR RPG Tools v2.1.1 has been installed!
|
127
127
|
===========================================
|
128
128
|
|
129
129
|
To start the application:
|