1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
| #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ Steal Skill - KGC_Steal ◆ VX ◆
#_/ ◇ Last Update: 2008/09/13 ◇
#_/ ◆ Translation by Mr. Anonymous ◆
#_/ ◆ Extended updates by Touchfuzzy and RFTD ◆
#_/ ◆ KGC Site: ◆
#_/ ◆ http://f44.aaa.livedoor.jp/~ytomy/ ◆
#_/ ◆ Translator's Blog: ◆
#_/ ◆ http://mraprojects.wordpress.com ◆
#_/----------------------------------------------------------------------------
#_/ This script allows you to assign skills that "steal" items, weapons, armor
#_/ and money.
#_/============================================================================
#_/ ◆ Instructions For Usage ◆
#_/
#_/ Setup is simple. To assign a skill as a Steal skill, add the tag "<steal>"
#_/ (without quotations) into the "Note" box on the skill you choose in the
#_/ skills database. Next, to set up enemies you can steal from, in the enemies
#_/ database, you enter <steal X:ID Probability %>
#_/
#_/ Where X = Steal type. I = Items, W = Weapons, A = Armor, and G = Gold
#_/
#_/ Where ID = The specified item, weapon, or armor's ID #, in the database
#_/ OR the amount of gold that can be stolen.
#_/
#_/ Where Probability % = The chance of the item being stolen.
#_/
#_/ Extestle: You have a bandit (enemy) who has a Long Sword and 100 gold you'd
#_/ like to be able to steal from him, at a 50% chance. Tag him with:
#_/ <steal W:2 50%>
#_/ <steal G:100 50%>
#_/
#_/ New! Equipment that effects steal probability
#_/ You may define equipment that increases or decreases the odds of the
#_/ steal skill's success. To take advantage of this feature, tag the equip:
#_/ <steal_prob_plus Modifier Rate %>
#_/ Where Modifier = Addition( + ) or Subtraction( - )
#_/ Where Rate = the amount of increase/decrease in probability.
#_/
#_/ Extestle: You'd like an accessory you created called "Theif's Ring" to
#_/ increase an actor's stealing probability by 15%. You'd tag that ring:
#_/ <steal_prob_plus + 15%>
#_/============================================================================
#_/ Install: Insert below KGC_EnemyGuide, and PG Tankentai Sideview Battle
#_/ System, if applicable.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================#
# ★ Customization ★ #
#==============================================================================#
module KGC
module Steal
# ◆ Display Messages ◆
# Target skill used on has nothing to steal.
# (Where %s = target)
# %s : has nothing to steal!
VOCAB_STEAL_NO_ITEM = "%s n'a rien!"
# ◆ Steal skill failed.
VOCAB_STEAL_FAILURE = "Raté!"
# ◆ When stealing an item.
# First %s : Target name
# Second %s : Item Name
VOCAB_STEAL_ITEM = "%s s'est fait voler 1 %s !"
# ◆ When stealing money/gold.
# First %s : Target name
# Second %s : Amount stolen
# Third %s : Gold unit name. (Ex "GP", or"$")
VOCAB_STEAL_GOLD = "%s s'est fait voler %s%s!"
# ◆ Agility Based Steal ◆
# Implemented on 3/14/08 by Touchfuzzy.
# If this is true then the skill chance is figured as Steal% * Tagi * Eagi.
# If this toggle is false, then the default percentage system is used.
# Steal% = Steal Percentage used in Enemy Notes tag.
# Cagi = Thief's (Actor using the skill) Agility
# Eagi = Enemy's Agility
AGILITY_BASED_STEAL = true
# ◆ RPG Tankentai Sideview Battle System Steal Messages ◆
# Implemented on 8/27/08 by RFTD.
# If you're using RPG Tankentai Sideview Battle System, set this toggle to
# true in order to display the above defined messages.
# If don't use the RPG Tankentai Sideview Battle System or you'd rather the
# "steal" messages to be removed, set this to false.
USING_SIDEVIEW = true
end
end
#=============================================================================#
# ★ End Customization ★ #
#=============================================================================#
#=================================================#
# IMPORT #
#=================================================#
$imported = {} if $imported == nil
$imported["Steal"] = true
#=================================================#
#==============================================================================
# □ KGC::Steal::Regexp
#==============================================================================
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
# Note Field Tag Strings #
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
# Whatever word(s) are after the separator ( | ) in the following lines are
# what are used to determine what is searched for in the "Note" section of a
# skill or enemy.
module KGC::Steal
module Regexp
module BaseItem
# Steal Probability Increase tag string
STEAL_PROB_PLUS = /<(?:STEAL_PROB|steal_prob_plus)\s*([\+\-]\d+)[%%]?>/i
end
# Base Skill Module
module Skill
# Steal tag string
STEAL = /<(?:STEAL|steal)>/i
end
# Enemy Module
module Enemy
# Object to Steal tag string.
STEAL_OBJECT = /<(?:STEAL|steal)\s*([IWAG]):(\d+)\s+(\d+)([%%])?>/i
end
end
end
#=================================================
#==============================================================================
# ■ Vocab
#==============================================================================
module Vocab
# Set text defined in the customization area to the vocab module.
StealItem = KGC::Steal::VOCAB_STEAL_ITEM
StealGold = KGC::Steal::VOCAB_STEAL_GOLD
StealNoItem = KGC::Steal::VOCAB_STEAL_NO_ITEM
StealFailure = KGC::Steal::VOCAB_STEAL_FAILURE
end
#=================================================
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
# ○ 「盗む」のキャッシュ生成
#--------------------------------------------------------------------------
def create_steal_cache
@__steal_prob_plus = 0
self.note.each_line { |line|
case line
when KGC::Steal::Regexp::BaseItem::STEAL_PROB_PLUS
# 盗み成功率補正
@__steal_prob_plus += $1.to_i
end
}
end
#--------------------------------------------------------------------------
# ○ 盗み成功率補正
#--------------------------------------------------------------------------
def steal_prob_plus
create_steal_cache if @__steal_prob_plus == nil
return @__steal_prob_plus
end
end
#=================================================
#==============================================================================
# ■ RPG::Skill
#==============================================================================
class RPG::Skill < RPG::UsableItem
#--------------------------------------------------------------------------
# ○ 「盗む」のキャッシュ生成
#--------------------------------------------------------------------------
def create_steal_cache
super
@__steal = false
self.note.each_line { |line|
case line
when KGC::Steal::Regexp::Skill::STEAL
# 盗む
@__steal = true
end
}
end
#--------------------------------------------------------------------------
# ○ 盗む
#--------------------------------------------------------------------------
def steal?
create_steal_cache if @__steal == nil
return @__steal
end
end
#=================================================
#==============================================================================
# ■ RPG::Enemy
#==============================================================================
class RPG::Enemy
#--------------------------------------------------------------------------
# ○ 「盗む」のキャッシュ生成
#--------------------------------------------------------------------------
def create_steal_cache
@__steal_objects = []
self.note.each_line { |line|
case line
when KGC::Steal::Regexp::Enemy::STEAL_OBJECT
# 盗めるオブジェクト
obj = RPG::Enemy::StealObject.new
case $1.upcase
when "I" # アイテム
obj.kind = 1
obj.item_id = $2.to_i
when "W" # 武器
obj.kind = 2
obj.weapon_id = $2.to_i
when "A" # 防具
obj.kind = 3
obj.armor_id = $2.to_i
when "G" # 金
obj.kind = 4
obj.gold = $2.to_i
else
next
end
# 成功率
if $4 != nil
obj.success_prob = $3.to_i
else
obj.denominator = $3.to_i
end
@__steal_objects << obj
end
}
end
#--------------------------------------------------------------------------
# ○ 盗めるオブジェクト
#--------------------------------------------------------------------------
def steal_objects
create_steal_cache if @__steal_objects == nil
return @__steal_objects
end
end
#=================================================
#==============================================================================
# □ RPG::Enemy::StealObject
#==============================================================================
class RPG::Enemy::StealObject < RPG::Enemy::DropItem
#--------------------------------------------------------------------------
# ○ 定数
#--------------------------------------------------------------------------
KIND_ITEM = 1
KIND_WEAPON = 2
KIND_ARMOR = 3
KIND_GOLD = 4
#--------------------------------------------------------------------------
# ○ 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :gold # 金
attr_accessor :success_prob # 成功率
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super
@gold = 0
@success_prob = 0
end
#--------------------------------------------------------------------------
# ○ 同値判定
#--------------------------------------------------------------------------
def equal?(obj)
return false unless obj.is_a?(RPG::Enemy::StealObject)
return false if self.gold != obj.gold
return false if self.success_prob != obj.success_prob
return true
end
#--------------------------------------------------------------------------
# ○ 等値演算子
#--------------------------------------------------------------------------
def ==(obj)
return self.equal?(obj)
end
end
#=================================================
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ○ 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :steal_objects # 盗めるオブジェクト
attr_accessor :stolen_object # 前回盗まれたオブジェクト
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_Battler_KGC_Steal initialize
def initialize
initialize_Battler_KGC_Steal
@steal_objects = []
@stolen_object = nil
end
#--------------------------------------------------------------------------
# ○ 盗み成功率補正値
#--------------------------------------------------------------------------
def steal_prob_plus
return 0
end
#--------------------------------------------------------------------------
# ● スキルの効果適用
# user : スキルの使用者
# skill : スキル
#--------------------------------------------------------------------------
alias skill_effect_KGC_Steal skill_effect
def skill_effect(user, skill)
skill_effect_KGC_Steal(user, skill)
make_obj_steal_result(user, skill)
end
#--------------------------------------------------------------------------
# ○ スキルまたはアイテムによる盗み効果
# user : スキルまたはアイテムの使用者
# obj : スキルまたはアイテム
# 結果は @stolen_object に代入する。
#--------------------------------------------------------------------------
def make_obj_steal_result(user, obj)
return unless obj.steal? # 盗み効果なし
return if @skipped || @missed || @evaded # 効果なし
# 何も持っていない
if self.steal_objects.compact.empty?
@stolen_object = :no_item
return
end
@stolen_object = nil
stolen_index = -1
self.steal_objects.each_with_index { |sobj, i|
next if sobj == nil
# Added by TouchFuzzy 3/14/08
if KGC::Steal::AGILITY_BASED_STEAL
sobj.success_prob = sobj.success_prob * user.agi / self.agi
end
# End Agility Based Steal Update
# 盗み成功判定
if sobj.success_prob > 0
# 確率指定
next if sobj.success_prob + user.steal_prob_plus < rand(100)
else
# 分母指定
if rand(sobj.denominator) != 0
next if user.steal_prob_plus < rand(100)
end
end
# 盗み成功
@stolen_object = sobj
stolen_index = i
if $imported["EnemyGuide"]
# 図鑑用の盗み成功フラグをオン
self_id = (self.actor? ? self.id : self.enemy_id)
KGC::Commands.set_enemy_object_stolen(self_id, stolen_index)
end
break
}
if stolen_index != -1
@steal_objects[stolen_index] = nil
end
end
end
#=================================================
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ○ 盗み成功率補正値
#--------------------------------------------------------------------------
def steal_prob_plus
n = 0
equips.compact.each { |item| n += item.steal_prob_plus }
return n
end
end
#=================================================
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# index : 敵グループ内インデックス
# enemy_id : 敵キャラ ID
#--------------------------------------------------------------------------
alias initialize_Enemy_KGC_Steal initialize
def initialize(index, enemy_id)
initialize_Enemy_KGC_Steal(index, enemy_id)
@steal_objects = enemy.steal_objects.clone
end
end
#=================================================
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● 戦闘行動の実行 : スキル
#--------------------------------------------------------------------------
alias execute_action_skill_KGC_Steal execute_action_skill
def execute_action_skill
skill = @active_battler.action.skill
if skill.steal?
execute_action_steal
@status_window.refresh
else
execute_action_skill_KGC_Steal
end
end
#--------------------------------------------------------------------------
# ○ 戦闘行動の実行 : 盗む
#--------------------------------------------------------------------------
def execute_action_steal
skill = @active_battler.action.skill
text = @active_battler.name + skill.message1
@message_window.add_instant_text(text)
unless skill.message2.empty?
wait(10)
@message_window.add_instant_text(skill.message2)
end
targets = @active_battler.action.make_targets
display_animation(targets, skill.animation_id)
@active_battler.mp -= @active_battler.calc_mp_cost(skill)
$game_temp.common_event_id = skill.common_event_id
for target in targets
target.skill_effect(@active_battler, skill)
display_steal_effects(target, skill)
end
end
#--------------------------------------------------------------------------
# ○ 盗んだ結果の表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_steal_effects(target, obj = nil)
unless target.skipped
line_number = @message_window.line_number
wait(5)
if target.hp_damage != 0 || target.mp_damage != 0
display_critical(target, obj)
display_damage(target, obj)
end
display_stole_object(target, obj)
display_state_changes(target, obj)
if line_number == @message_window.line_number
display_failure(target, obj) unless target.states_active?
end
if line_number != @message_window.line_number
wait(30)
end
@message_window.back_to(line_number)
end
end
#--------------------------------------------------------------------------
# ○ 盗んだオブジェクトの表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_stole_object(target, obj = nil)
if target.missed || target.evaded
display_steal_failure(target, obj)
return
end
case target.stolen_object
when nil # 盗み失敗
display_steal_failure(target, obj)
when :no_item # 何も持っていない
display_steal_no_item(target, obj)
else
if target.stolen_object.kind == RPG::Enemy::StealObject::KIND_GOLD
# お金
display_steal_gold(target, obj)
else
# アイテム or 武器 or 防具
display_steal_item(target, obj)
end
target.stolen_object = nil
end
end
#--------------------------------------------------------------------------
# ○ 盗み失敗の表示
# target : 対象者 (アクター)
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_steal_failure(target, obj)
# Implemented by RFTD 8/27/08
if KGC::Steal::USING_SIDEVIEW
result_data = sprintf(Vocab::StealFailure)
@steal_window = Steal_Window.new(result_data)
@steal_window.visible = true
wait (160)
@steal_window.dispose
else
@message_window.add_instant_text(Vocab::StealFailure)
wait(30)
end
end
#--------------------------------------------------------------------------
# ○ 何も持っていない場合の表示
# target : 対象者 (アクター)
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_steal_no_item(target, obj)
# Implemented by RFTD 8/27/08
if KGC::Steal::USING_SIDEVIEW
result_data = sprintf(Vocab::StealNoItem, target.name)
@steal_window = Steal_Window.new(result_data)
@steal_window.visible = true
wait (160)
@steal_window.dispose
else
text = sprintf(Vocab::StealNoItem, target.name)
@message_window.add_instant_text(text)
wait(30)
end
end
#--------------------------------------------------------------------------
# ○ アイテムを盗んだ場合の表示
# target : 対象者 (アクター)
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_steal_item(target, obj)
# 盗んだアイテムを取得
sobj = target.stolen_object
case sobj.kind
when RPG::Enemy::StealObject::KIND_ITEM
item = $data_items[sobj.item_id]
when RPG::Enemy::StealObject::KIND_WEAPON
item = $data_weapons[sobj.weapon_id]
when RPG::Enemy::StealObject::KIND_ARMOR
item = $data_armors[sobj.armor_id]
else
return
end
$game_party.gain_item(item, 1)
# Implemented by RFTD 8/27/08
if KGC::Steal::USING_SIDEVIEW
result_data = sprintf(Vocab::StealItem, target.name, item.name)
@steal_window = Steal_Window.new(result_data)
@steal_window.visible = true
wait (160)
@steal_window.dispose
else
text = sprintf(Vocab::StealItem, target.name, item.name)
@message_window.add_instant_text(text)
wait(30)
end
end
#--------------------------------------------------------------------------
# ○ お金を盗んだ場合の表示
# target : 対象者 (アクター)
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_steal_gold(target, obj)
gold = target.stolen_object.gold
$game_party.gain_gold(gold)
# Implemented by RFTD 8/27/08
if KGC::Steal::USING_SIDEVIEW
result_data = sprintf(Vocab::StealGold, target.name, gold, Vocab.gold)
@steal_window = Steal_Window.new(result_data)
@steal_window.visible = true
wait (160)
@steal_window.dispose
else
text = sprintf(Vocab::StealGold, target.name, gold, Vocab.gold)
@message_window.add_instant_text(text)
wait(30)
end
end
end
#=================================================
if KGC::Steal::USING_SIDEVIEW
#--------------------------------------------------------------------------
# ■ Steal Message Window
#--------------------------------------------------------------------------
# Method exclusive for the RPG Tankentai Sideview Battle System
#--------------------------------------------------------------------------
class Steal_Window < Window_Base
def initialize(result_data)
super(15, 0, 516, 60)
self.z = 10001
contents.font.color = normal_color
contents.draw_text(0, 0, contents.width, WLH, result_data)
end
end
end #<-if KGC::Steal::USING_SIDEVIEW |