Redclaw

Rekrut

  • »Redclaw« ist der Autor dieses Themas

Motto: Beat down your enemy, you are your only true enemy!

  • Nachricht senden

1

Mittwoch, 8. März 2017, 17:16

Probleme mit Menü Erstellung

Guten Tag zusammen :D

Ich arbeite momentan gerade an einem "Keysystem"-Skript.
Nunja dabei geht es um eben um ein System um Schlüssel besser verwalten zu können.
Auf diese Idee kam ich, weil ich in meinem aktuellen Spiel einige Schlüssel einbauen will, die der Spieler natürlich erst besitzen muss um damit die verschlossenen Bereiche betreten zu können. Natürlich würde das realisieren dieser Aufgabe gehen indem man diese Schlüssel einfach als Items erfasst und dann per Event überprüft ob der Spieler dieses Item bereits im Inventar hat. Allerdings finde ich das etwas hässlich, wenn dann das ganze Inventar mit solchen Schlüsseln zugemüllt ist. (Ausserdem hat es bei bei meinem Projekt auch den Vorteil, dass diese nicht als Items zählen und Inventarslots benötigen). Deshalb dachte ich mir ich mache einfach ein Skript wo man dann mit wenig Aufwand solche Schlüssel erfassen kann.
Ich habe auch noch die Möglichkeit eingebaut, verschiedene Typen zu definieren so kann man z.b nicht nur übliche Schlüssel, sondern auch Zutrittskarten oder anderes dort erfassen, so hat man dann die Möglichkeit zum Beispiel auch wichtige Items dort zu verlagern.

Da dies mein erstes ("längeres") Skript ist, ist es für mich noch eine Herausforderung, durch die ich aber bereits viel gelernt habe :).

Die Haupttfunktionalität funktioniert bereits, es ist bereits möglich mit dem Skript Schlüssel zu erfassen und sie werden auch gespeichert und beim fortsetzen eines Spiels wieder geladen.
Allerdings bin ich noch nicht gut, was die Erstellung von neuen Menüs angeht.
Momentan ist das Problem unter anderem, dass ich nicht weiss, wie ich die aktuelle Auswahl eines Windows (Windows_HorzCommand) an ein anderes (Windows_Selectable) weitergeben kann. Beziehungsweise wo ich diesen Wert überhaupt finde. Ich dachte zuerst es handelt sich dabei um @category doch wenn ich diese Variable in einer msgbox ausgebe, ist es immer nil.

Eigentlich wollte ich selber herausfinden wo der Fehler liegt nur bin ich gerade etwas frustriert :/
Die Sache ist, dass ich nicht so lange an dem Skript hängen wollte, da ich eigentlich lieber wieder auch an dem Rest des Spiels weiterarbeiten würde.

Ich denke aber auch, dass mein Skript wahrscheinlich noch Unsauberheiten oder Logikfehler enthält, falls etwas auffällt bitte sagt es mir :3.

Hier das aktuelle (fehlerhafte xD) Skript:
Spoiler

Ruby Quellcode

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
# =============================================================================
# Redclaw - Key System
# Version : 0.1 Alpha
# Contact : www.rpgmakerstudio.org jeremias.nigg@gmail.com
# (English Documentation)
# =============================================================================
($imported ||= {})[:Red_keysystem] = true
# =============================================================================
# Changelog:
# -----------------------------------------------------------------------------
# 2017.02.24 - Creation of the script 
# =============================================================================
 
module SC #Module for shortcuts
BRK = "\r\n" #Shortcut for newline
end
 
module REDCLAW
module KEYSYS #REDCLAW::KEYSYS
module CONFIG
#Changeable settings for the script should be located here
MENU_BACKGROUND_IMAGE = "Titles1/Book.png" #The path (after Graphics/) of the background image
end #REDCLAW::KEYSYS::CONFIG
module VOCAB #REDCLAW::KEYSYS::VOCAB
 
MENU_BUTTON_NAME = "Keys and Cards" #The name which will be used to display the button in the main menu.
MENU_WINDOW_TITLE = MENU_BUTTON_NAME
end #VOCAB
 
TYPES = []
TYPES[0] = {
"name" => "Key",
"id" => 1
}
 
TYPES[1] = {
"name" => "Card",
"id" => 2
}
 
KEYS = []
KEYS[0] = {
"name" => "Masterkey", #The name of the key which will be displayed in the menu
"type" => 1, #The Id of TYPES
"id" => 1, #Id for this keyitem
"icon" => 1, #Icon to display (number of the icon, look it up in your database)  
"description" => "The best key at all, you are able to open any door with it.", #The description which will be used to be displayed in the menu
"consumable" => false, #Defines if the player loses the keyitem on usage
"amount" => 0 #Amount of keys the player will get in a new game. - Usually you should set this on 0 because the player shouldn't spawn with it
 }
 
 KEYS[1] = {
"name" => "Entry ticket", #The name of the key which will be displayed in the menu
"type" => 2, #The Id of TYPES
"id" => 2, #Id for this keyitem
"icon" => 1, #Icon to display (number of the icon, look it up in your database)  
"description" => "A ticket to get in the holy special entry.", #The description which will be used to be displayed in the menu
"consumable" => true, #Defines if the player loses the keyitem on usage
"amount" => 0 #Amount of keys the player will get in a new game. - Usually you should set this on 0 because the player shouldn't spawn with it
 }
end #KEYSYS
end #REDCLAW
 
class Keysystem
 
attr_accessor :last_key
def initialize()
@all_items = [] #Array including all items (from the keysystem - not regular items)
@all_types = [] #Array including all types
@last_key = {"key" => nil,"type" => nil} #hash containing id and type of the last used key for cursor memorization
 
REDCLAW::KEYSYS::KEYS.each do |item_key| #initializing all the item objects in the array
@all_items.push(Item.new(item_key["name"],item_key["type"],item_key["id"],item_key["icon"],item_key["description"],item_key["consumable"],item_key["amount"])) 
end
 
REDCLAW::KEYSYS::TYPES.each do |item_type| #initializing all the type objects in the array
@all_types.push(Type.new(item_type["name"],item_type["id"])) 
end
end
 
def get_items()
  return @all_items
  end
 
def get_item(id)
  return @all_items[id-1]
end
 
def get_types
return @all_types
end
 
def typename(id)
return get_types[id-1].name 
end
 
def typesym(id)
typename(id).to_sym
end
 
def typesym_id(sym)
sym = sym.to_s
id = 0
get_types.each do |type|
if type.name == sym
id = type.id
end
end
return id
end
 
def possess?(id,takeitem = false) #use this method to check if the player actually possesses the item.
if @all_items[id-1].amount > 0
if @all_items[id-1].consumable && takeitem
@all_items[id-1].amount -= 1
end
return true
else
return false
end
end
 
def exhibit(id) #shortcut for check and remove an item (if the player posseses it)
possess?(id,true)
  end
 
 
def take(id,take_amount)
@all_items[id-1].amount -= take_amount if(posess?(id,true) == true)
end
 
def give(id,give_amount)
@all_items[id-1].amount += give_amount
end
 
def set(id,set_amount)
@all_items[id-1].amount = set_amount
end
 
def report(id,showmsg = false) #Report method for testing purposes
text = ""
text << ("Name: " + get_item(id).name + SC::BRK)
text << ("Type: " + typename(id) + SC::BRK)
text << ("Id: " + get_item(id).id.to_s + SC::BRK)
text << ("Iconnumber: " + get_item(id).icon.to_s + SC::BRK)
text << ("Description: " + get_item(id).description + SC::BRK)
text << ("Consumable: " + get_item(id).consumable.to_s + SC::BRK)
text << ("Amount: " + get_item(id).amount.to_s)
if !showmsg
return text
else
msgbox(text)
end
end
 
def report_all(showmsg = false) #Report_all method for testing purposes
all_text = []
get_items.each do |item_obj|
  all_text.push(report(item_obj.id))
end
 
if !showmsg
return all_text
else
all_text.each do |txt|
  msgbox(txt)
  end
end
 
end
 
end #Keysystem
 
class Type < Keysystem
attr_reader :name
attr_reader :id
 
@name = ""
@id = 0
 
def initialize(name,id)
@name = name
@id = id
end
 
end #Type
 
class Item < Type
attr_reader :name
attr_reader :type
attr_reader :id
attr_reader :icon
attr_reader :description
attr_reader :consumable
attr_accessor :amount
 
@name = ""
@type = 0
@id = 0
@icon = 0
@description = ""
@consumable = false
@amount = 0;
 
def initialize(name,type,id,icon,description,consumable,amount)
@name = name
@type = type
@id = id
@icon = icon
@description = description
@consumable = consumable
@amount = amount
end
end #Item
 
class << DataManager
 
alias keysys_create_game_objects create_game_objects 
 
def create_game_objects
keysys_create_game_objects
$game_keysystem = Keysystem.new
end
 
def make_save_contents
	contents = {}
	contents[:system]    	= $game_system
	contents[:timer]     	= $game_timer
	contents[:message]   	= $game_message
	contents[:switches]  	= $game_switches
	contents[:variables] 	= $game_variables
	contents[:self_switches] = $game_self_switches
	contents[:actors]    	= $game_actors
	contents[:party]     	= $game_party
	contents[:troop]     	= $game_troop
	contents[:map]       	= $game_map
	contents[:player]    	= $game_player
	contents[:keysystem] 	= $game_keysystem
	contents
end
 
def extract_save_contents(contents)
	$game_system    	= contents[:system]
	$game_timer     	= contents[:timer]
	$game_message   	= contents[:message]
	$game_switches  	= contents[:switches]
	$game_variables 	= contents[:variables]
	$game_self_switches = contents[:self_switches]
	$game_actors    	= contents[:actors]
	$game_party     	= contents[:party]
	$game_troop     	= contents[:troop]
	$game_map       	= contents[:map]
	$game_player    	= contents[:player]
	$game_keysystem 	= contents[:keysystem]
  end
end #DataManager
 
class Window_KeyType < Window_HorzCommand
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader   :item_window
  attr_reader :type
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
	super(0, 0)
	@type = :none
  end
  #--------------------------------------------------------------------------
  # * Get Window Width
  #--------------------------------------------------------------------------
  def window_width
	Graphics.width
  end
  #--------------------------------------------------------------------------
  # * Get Digit Count
  #--------------------------------------------------------------------------
  def col_max
	return $game_keysystem.get_types.size
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
	super
	@item_window.category = current_symbol if @item_window
	@type = @item_window.category if @item_window
  end
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  def make_command_list
  $game_keysystem.get_types.each do |type|
	add_command(type.name, 	type.name.to_sym)
	end
  end
  #--------------------------------------------------------------------------
  # * Set Item Window
  #--------------------------------------------------------------------------
  def item_window=(item_window)
	@item_window = item_window
	update
  end
end
 
 
class Window_MenuCommand < Window_Command
 
 alias add_original_commands_keysys add_original_commands
  def add_original_commands
	add_original_commands_keysys
	add_command(REDCLAW::KEYSYS::VOCAB::MENU_BUTTON_NAME, :keys, true)
  end
end
class Window_Keys < Window_Selectable
  attr_accessor :category
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
	super
	@category = category
	@data = []
  end
  #--------------------------------------------------------------------------
  # * Set Category
  #--------------------------------------------------------------------------
  def category=(category)
	return if @category == category
	@category = category
	refresh
	self.oy = 0
  end
  #--------------------------------------------------------------------------
  # * Get Digit Count
  #--------------------------------------------------------------------------
  def col_max
	return 1
  end
  #--------------------------------------------------------------------------
  # * Get Number of Items
  #--------------------------------------------------------------------------
  def item_max
	@data ? @data.size : 1
  end
  #--------------------------------------------------------------------------
  # * Get Item
  #--------------------------------------------------------------------------
  def item
	@data && index >= 0 ? @data[index] : nil
  end
  #--------------------------------------------------------------------------
  # * Get Activation State of Selection Item
  #--------------------------------------------------------------------------
  def current_item_enabled?
	enable?(@data[index])
  end
  #--------------------------------------------------------------------------
  # * Include in Item List?
  #--------------------------------------------------------------------------
  def include?(item_id)
	#msgbox(@category)
  return $game_keysystem.typesym(item_id) == @category 
end
  #--------------------------------------------------------------------------
  # * Display in Enabled State?
  #--------------------------------------------------------------------------
  def enable?(item)
	return true
  end
  #--------------------------------------------------------------------------
  # * Create Item List
  #--------------------------------------------------------------------------
  def make_item_list
	@data = []
	$game_keysystem.get_items.each do |item|
  	data.push(item) if include?(item.id)
	end
	#msgbox(@data.to_s)
  end
  #--------------------------------------------------------------------------
  # * Restore Previous Selection Position
  #--------------------------------------------------------------------------
  def select_last
	#select(@data.index($game_keysystem.last_key.object) || 0)
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index)
	item = @data[index]
	if item
  	rect = item_rect(index)
  	rect.width -= 4
  	draw_item_name(item, rect.x, rect.y, enable?(item))
  	draw_item_number(rect, item)
	end
  end
  #--------------------------------------------------------------------------
  # * Draw Number of Items
  #--------------------------------------------------------------------------
  def draw_item_number(rect, item)
	draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
  end
  #--------------------------------------------------------------------------
  # * Update Help Text
  #--------------------------------------------------------------------------
  def update_help
	@help_window.set_item(item)
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
	make_item_list
	create_contents
	draw_all_items
  end
end #Window_Keys
 
# =============================================================================
# Scene classes goes here
# =============================================================================
# =============================================================================
# ? Scene_Keys
# =============================================================================
class Scene_Keys < Scene_Base
 
def start
	super
	create_keytype_window
	end
 
  #--------------------------------------------------------------------------
  # * Create Category Window
  #--------------------------------------------------------------------------
 
   def on_keytype_ok
   if @keytype_window == nil
	if $game_keysystem.last_key["type"] != nil
	@keytype_window.category = $game_keysystem.typesym($game_keysystem.last_key["type"])
	else
	$game_keysystem.last_key["type"] = $game_keysystem.typesym_id(@keytype_window.item_window.category)
end
end
 
	if @keyitems_window == nil
  	@keyitems_window =  Window_Keys.new(0,@keytype_window.height + 1, Graphics.width, Graphics.height - @keytype_window.height)
  	if @keytype_window != nil
  	@keytype_window.update
  	#msgbox("@keytype_window.category = " + @keytype_window.type.to_s)
  	@keyitems_window.category = @keytype_window.type
  	end
  	@keyitems_window.refresh
  	@keyitems_window.active
  	end
  end
 
   def draw_background(path)
  	backsprite = Sprite.new 
  	backsprite.bitmap = Bitmap.new(path)
	end
 
  def create_keytype_window
	@keytype_window = Window_KeyType.new
	draw_background("Graphics/" + REDCLAW::KEYSYS::CONFIG::MENU_BACKGROUND_IMAGE)
	@keytype_window.viewport = @viewport
	@keytype_window.y = 0
	@keytype_window.set_handler(:ok, 	method(:on_keytype_ok))
	@keytype_window.set_handler(:cancel, method(:return_scene))
  end
 
def make_keylist
keys = []
$game_keysystem.get_items.each do |key|
  keys.push(key) unless key.amount <= 0
  end
end
end #Scene_Keys
 
# =============================================================================
# ? Scene_Menu
# =============================================================================
class Scene_Menu < Scene_MenuBase
  alias redclaw_keysys create_command_window
 
  def command_keys
	SceneManager.call(Scene_Keys)
  end
 
  def create_command_window
	redclaw_keysys
	@command_window.set_handler(:keys, method(:command_keys))
  end
end #Scene_Menu
zum Lesen den Text mit der Maus markieren


Bin definitiv noch ein Anfänger was RGSS3 betrifft. Was habe ich übersehen beziehungsweise wie muss ich vorgehen damit das klappt?
Signatur folgt...

Redclaw

Rekrut

  • »Redclaw« ist der Autor dieses Themas

Motto: Beat down your enemy, you are your only true enemy!

  • Nachricht senden

2

Sonntag, 12. März 2017, 19:20

Okay ich habe mich jetzt einige Stunden selber rangesetzt und alles studiert jetzt fehlt nicht mehr viel und ich habe das Script endlich fertig.

Musste einiges umstrukturieren denn das was ich vorher hatte konnte gar nicht funktionieren, naja jetzt bin ich schon etwas schlauer :D.

Spoiler

Ruby Quellcode

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
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
# =============================================================================
# Redclaw - Key System
# Version : 0.1 Alpha
# Contact : www.rpgmakerstudio.org jeremias.nigg@gmail.com
# (English Documentation)
# =============================================================================
($imported ||= {})[:Red_keysystem] = true
# =============================================================================
# Changelog:
# -----------------------------------------------------------------------------
# 2017.02.24 - Creation of the script 
# =============================================================================
 
module SC #Module for shortcuts
BRK = "\r\n" #Shortcut for newline
end
 
module REDCLAW
module KEYSYS #REDCLAW::KEYSYS
module CONFIG
#Changeable settings for the script should be located here
MENU_BACKGROUND_IMAGE = "Graphics/Titles1/Book.png" #The path (after Graphics/) of the background image
MENU_KEYINFO_PICTUREFOLDER = "Graphics/Pictures/" #Folder which contains the pictures for the keys
end #REDCLAW::KEYSYS::CONFIG
module VOCAB #REDCLAW::KEYSYS::VOCAB
MENU_BUTTON_NAME = "Keys and Cards" #The name which will be used to display the button in the main menu.
MENU_WINDOW_TITLE = MENU_BUTTON_NAME
end #VOCAB
 
TYPES = []
TYPES[0] = {
"name" => "Key",
"id" => 1
}
 
TYPES[1] = {
"name" => "Card",
"id" => 2
}
 
KEYS = []
KEYS[0] = {
"name" => "Masterkey", #The name of the key which will be displayed in the menu
"type" => 1, #The Id of TYPES
"id" => 1, #Id for this keyitem
"icon_index" => 243, #Icon to display (number of the icon, look it up in your database)
"picture" => "", #filename of picture displayed in the menu - use "" to display the icon there instead
"description" => "The best key at all, you are able to open any door with it.", #The description which will be used to be displayed in the menu
"consumable" => false, #Defines if the player loses the keyitem on usage
"amount" => 1 #Amount of keys the player will get in a new game. - Usually you should set this on 0 because the player shouldn't spawn with it
 }
 
 KEYS[1] = {
"name" => "Entry ticket", #The name of the key which will be displayed in the menu
"type" => 2, #The Id of TYPES
"id" => 2, #Id for this keyitem
"icon_index" => 239, #Icon to display (number of the icon, look it up in your database)  
"picture" => "", #filename of picture displayed in the menu - use "" to display the icon there instead
"description" => "A ticket to get in the holy special entry.", #The description which will be used to be displayed in the menu
"consumable" => true, #Defines if the player loses the keyitem on usage
"amount" => 1 #Amount of keys the player will get in a new game. - Usually you should set this on 0 because the player shouldn't spawn with it
 }
 
 KEYS[2] = {
"name" => "Housekey", #The name of the key which will be displayed in the menu
"type" => 1, #The Id of TYPES
"id" => 3, #Id for this keyitem
"icon_index" => 241, #Icon to display (number of the icon, look it up in your database)  
"picture" => "", #filename of picture displayed in the menu - use "" to display the icon there instead
"description" => "This is the key of my sweet home.", #The description which will be used to be displayed in the menu
"consumable" => false, #Defines if the player loses the keyitem on usage
"amount" => 1 #Amount of keys the player will get in a new game. - Usually you should set this on 0 because the player shouldn't spawn with it
 }
end #KEYSYS
end #REDCLAW
 
class Keysystem
 
attr_accessor :last_keys
attr_accessor :active_type
 
def initialize()
@all_items = [] #Array including all items (from the keysystem - not regular items)
@all_types = [] #Array including all types
@active_type = :none
@last_keys = []
REDCLAW::KEYSYS::KEYS.each do |item_key| #initializing all the item objects in the array
@all_items.push(Item.new(item_key["name"],item_key["type"],item_key["id"],item_key["icon_index"],item_key["picture"],item_key["description"],item_key["consumable"],item_key["amount"])) 
end
 
REDCLAW::KEYSYS::TYPES.each do |item_type| #initializing all the type objects in the array
@all_types.push(Type.new(item_type["name"],item_type["id"])) 
end
 
@all_types.each do |item_type|
@last_keys.push({"type_sym" => item_type.name.to_sym ,"item_id" => -1})
end
end
 
def get_items()
  return @all_items
  end
 
def get_item(id)
 return @all_items[id-1]
end
 
def get_types
return @all_types
end
 
def typename(id)
return get_types[id-1].name 
end
 
def typesym(id)
typename(id).to_sym
end
 
def typesym_id(sym)
sym = sym.to_s
id = 0
get_types.each do |type|
if type.name == sym
id = type.id
end
end
return id
end
 
def possess?(id,takeitem = false) #use this method to check if the player actually possesses the item.
if @all_items[id-1].amount > 0
if @all_items[id-1].consumable && takeitem
@all_items[id-1].amount -= 1
end
return true
else
return false
end
end
 
def exhibit(id) #shortcut for check and remove an item (if the player posseses it)
possess?(id,true)
  end
 
 
def take(id,take_amount)
@all_items[id-1].amount -= take_amount if(posess?(id,true) == true)
end
 
def give(id,give_amount)
@all_items[id-1].amount += give_amount
end
 
def set(id,set_amount)
@all_items[id-1].amount = set_amount
end
 
def report(id,showmsg = false) #Report method for testing purposes
text = ""
text << ("Name: " + get_item(id).name + SC::BRK)
text << ("Type: " + typename(get_item(id).type) + SC::BRK)
text << ("Id: " + get_item(id).id.to_s + SC::BRK)
text << ("Iconnumber: " + get_item(id).icon_index.to_s + SC::BRK)
text << ("Description: " + get_item(id).description + SC::BRK)
text << ("Consumable: " + get_item(id).consumable.to_s + SC::BRK)
text << ("Amount: " + get_item(id).amount.to_s)
if !showmsg
return text
else
msgbox(text)
end
end
 
def report_all(showmsg = false) #Report_all method for testing purposes
all_text = []
get_items.each do |item_obj|
  all_text.push(report(item_obj.id))
end
 
if !showmsg
return all_text
else
all_text.each do |txt|
msgbox(txt)
  end
end
 
end
 
end #Keysystem
 
class Type < Keysystem
attr_reader :name
attr_reader :id
 
@name = ""
@id = 0
 
def initialize(name,id)
@name = name
@id = id
end
 
end #Type
 
class Item < Type
attr_reader :name
attr_reader :type
attr_reader :id
attr_reader :icon_index
attr_reader :picture
attr_reader :description
attr_reader :consumable
attr_accessor :amount
 
@name = ""
@type = 0
@id = 0
@icon_index = 0
@picture = 0
@description = ""
@consumable = false
@amount = 0;
 
def initialize(name,type,id,icon_index,picture,description,consumable,amount)
@name = name
@type = type
@id = id
@icon_index = icon_index
@picture = picture
@description = description
@consumable = consumable
@amount = amount
end
end #Item
 
class << DataManager
 
alias keysys_create_game_objects create_game_objects 
 
def create_game_objects
keysys_create_game_objects
$game_keysystem = Keysystem.new
end
 
def make_save_contents
	contents = {}
	contents[:system]    	= $game_system
	contents[:timer]     	= $game_timer
	contents[:message]   	= $game_message
	contents[:switches]  	= $game_switches
	contents[:variables] 	= $game_variables
	contents[:self_switches] = $game_self_switches
	contents[:actors]    	= $game_actors
	contents[:party]     	= $game_party
	contents[:troop]     	= $game_troop
	contents[:map]       	= $game_map
	contents[:player]    	= $game_player
	  contents[:keysystem] 	= $game_keysystem
	contents
end
 
def extract_save_contents(contents)
	$game_system    	= contents[:system]
	$game_timer     	= contents[:timer]
	$game_message   	= contents[:message]
	$game_switches  	= contents[:switches]
	$game_variables 	= contents[:variables]
	$game_self_switches = contents[:self_switches]
	$game_actors    	= contents[:actors]
	$game_party     	= contents[:party]
	$game_troop     	= contents[:troop]
	$game_map       	= contents[:map]
	$game_player    	= contents[:player]
	$game_keysystem 	= contents[:keysystem]
  end
end #DataManager
 
class Window_KeyType < Window_HorzCommand
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader  :item_window
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
	super(0, 0)
	@type = :none
	@type = $game_keysystem.active_type
  end
  #--------------------------------------------------------------------------
  # * Get Window Width
  #--------------------------------------------------------------------------
  def window_width
	Graphics.width
  end
  #--------------------------------------------------------------------------
  # * Get Digit Count
  #--------------------------------------------------------------------------
  def col_max
	return $game_keysystem.get_types.size
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
	super
	$game_keysystem.active_type = current_symbol
  end
  #--------------------------------------------------------------------------
  # * Create Command List
  #--------------------------------------------------------------------------
  def make_command_list
  $game_keysystem.get_types.each do |type|
  add_command(type.name, 	type.name.to_sym)
	end
  end
  #--------------------------------------------------------------------------
  # * Set Item Window
  #--------------------------------------------------------------------------
  def item_window=(item_window)
	@item_window = item_window
	update
  end
end
 
 
class Window_MenuCommand < Window_Command
 
 alias add_original_commands_keysys add_original_commands
  def add_original_commands
	add_original_commands_keysys
	add_command(REDCLAW::KEYSYS::VOCAB::MENU_BUTTON_NAME, :keys, true)
  end
end
 
class Window_Keys < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height)
	super
	@type = $game_keysystem.active_type
	@category = @type
	@data = []
  end
  #--------------------------------------------------------------------------
  # * Set Category
  #--------------------------------------------------------------------------
  def category=(category)
	return if @category == category
	@category = category
	refresh
	self.oy = 0
  end
  #--------------------------------------------------------------------------
  # * Get Digit Count
  #--------------------------------------------------------------------------
  def col_max
	return 1
  end
  #--------------------------------------------------------------------------
  # * Get Number of Items
  #--------------------------------------------------------------------------
  def item_max
	@data ? @data.size : 1
  end
  #--------------------------------------------------------------------------
  # * Get Item
  #--------------------------------------------------------------------------
  def item
	@data && index >= 0 ? @data[index] : nil
  end
  #--------------------------------------------------------------------------
  # * Get Activation State of Selection Item
  #--------------------------------------------------------------------------
  def current_item_enabled?
	enable?(@data[index])
  end
  #--------------------------------------------------------------------------
  # * Include in Item List?
  #--------------------------------------------------------------------------
  def include?(item)
  #$game_keysystem.report(item_id,true)
  type_id = item.type
  include_item = $game_keysystem.typesym(type_id) == @type && $game_keysystem.possess?(item.id)
  #msgbox(include_item)
  return include_item
end
  #--------------------------------------------------------------------------
  # * Display in Enabled State?
  #--------------------------------------------------------------------------
  def enable?(item)
	return true
  end
  #--------------------------------------------------------------------------
  # * Create Item List
  #--------------------------------------------------------------------------
  def make_key_list
	@data.clear
	@type = $game_keysystem.active_type
	$game_keysystem.get_items.each do |item|
	@data.push(item) if include?(item)
	end
  end
  #--------------------------------------------------------------------------
  # * Restore Previous Selection Position
  #--------------------------------------------------------------------------
  def select_last
	select(0)
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index)
	item = @data[index]
	if item
  	rect = item_rect(index)
  	rect.width -= 4
  	draw_item_name(item, rect.x, rect.y, enable?(item))
  	draw_item_number(rect, item)
	end
  end
  #--------------------------------------------------------------------------
  # * Draw Number of Items
  #--------------------------------------------------------------------------
  def draw_item_number(rect, item)
	draw_text(rect, sprintf(":-", item.amount.to_s), 2) #if item.amount > 1
  end
  #--------------------------------------------------------------------------
  # * Update Help Text
  #--------------------------------------------------------------------------
  def update_help
	@help_window.set_item(item)
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
	make_key_list
	create_contents
	draw_all_items
  end
 
  def clear
  self.contents.clear
  end
end #Window_Keys
 
class Window_Keyinfo < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
	super(0, 0, Graphics.width, Graphics.height)
	refresh
	draw_picture(0,0)
  end
 
  def picture_path
  return REDCLAW::KEYSYS::CONFIG::MENU_BACKGROUND_IMAGE
	end
 
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
	contents.clear
  end
  #--------------------------------------------------------------------------
  # * Open Window
  #--------------------------------------------------------------------------
  def open
	refresh
	super
  end
 
  def draw_picture(x, y, enabled = true)
	bitmap = Bitmap.new(picture_path)
	rect = Rect.new(0, 0, bitmap.width, bitmap.height)
	contents.blt(x, y, bitmap, rect, enabled ? 255 : translucent_alpha)
  end
end
 
 
 
# =============================================================================
# Scene classes goes here
# =============================================================================
# =============================================================================
# ? Scene_Keys
# =============================================================================
 
class Scene_KeysBase < Scene_MenuBase
 
def dispose_main_viewport
	@viewport.dispose if @viewport != nil
  end
end
 
 
class Scene_KeysBase < Scene_MenuBase
  #--------------------------------------------------------------------------
  # * Start Processing
  #--------------------------------------------------------------------------
  def start
	super
  end
 
  def draw_background(path)
  	@background_sprite = Sprite.new 
  	@background_sprite = Bitmap.new(path)
	end
 
   def create_background
	draw_background(REDCLAW::KEYSYS::CONFIG::MENU_BACKGROUND_IMAGE)
	end
  #--------------------------------------------------------------------------
  # * Get Currently Selected Item
  #--------------------------------------------------------------------------
  def item
	@keyitems_window.item
  end
  #--------------------------------------------------------------------------
  # * Determine if Cursor Is in Left Column
  #--------------------------------------------------------------------------
  def cursor_left?
	@item_window.index % 2 == 0
  end
  #--------------------------------------------------------------------------
  # * Show Subwindow
  #--------------------------------------------------------------------------
  def show_sub_window(window)
	width_remain = Graphics.width - window.width
	window.x = cursor_left? ? width_remain : 0
	@viewport.rect.x = @viewport.ox = cursor_left? ? 0 : window.width
	@viewport.rect.width = width_remain
	window.show.activate
  end
  #--------------------------------------------------------------------------
  # * Hide Subwindow
  #--------------------------------------------------------------------------
  def hide_sub_window(window)
	@viewport.rect.x = @viewport.ox = 0
	@viewport.rect.width = Graphics.width
	window.hide.deactivate
	activate_item_window
  end
  #--------------------------------------------------------------------------
  # * Activate Item Window
  #--------------------------------------------------------------------------
  def activate_item_window
	@keyitems_window.refresh
	@keyitems_window.activate
  end
  #--------------------------------------------------------------------------
  # * Determine if Common Event Is Reserved
  #	Transition to the map screen if the event call is reserved.
  #--------------------------------------------------------------------------
  def check_common_event
	SceneManager.goto(Scene_Map) if $game_temp.common_event_reserved?
  end
end
 
class Scene_Keys < Scene_KeysBase
def start
	create_keytype_window
	create_keyitems_window
	create_keyinfo_window
	create_background
	end
 
  #--------------------------------------------------------------------------
  # * Create Category Window
  #--------------------------------------------------------------------------
   def on_keytype_ok
 	@keyitems_window.activate
 	@keyitems_window.refresh
 	@keyitems_window.select(0)
   end
 
   def on_item_cancel
	@keyitems_window.unselect
	@keytype_window.activate
  end
 
  def create_keytype_window
	@keytype_window = Window_KeyType.new
	@keytype_window.viewport = @viewport
	@keytype_window.y = 0
	@keytype_window.item_window = @keyitems_window
	@keytype_window.set_handler(:ok, 	method(:on_keytype_ok))
	@keytype_window.set_handler(:cancel, method(:return_scene))
  end
 
def create_keyitems_window
@keyitems_window = Window_Keys.new(0,@keytype_window.height + 1, Graphics.width, Graphics.height - @keytype_window.height)
@keyitems_window.set_handler(:ok, 	method(:on_confirm))
@keyitems_window.set_handler(:cancel, method(:return_typeselect))
end
 
def create_keyinfo_window
@keyinfo_window = Window_Keyinfo.new
@keyinfo_window.set_handler(:cancel, 	method(:close_keyinfo))
@keyinfo_window.hide
end
 
def show_keyinfo
@keytype_window.hide
@keyitems_window.deactivate
@keyitems_window.hide
@keyinfo_window.show
end
 
def close_keyinfo
@keyinfo.window.hide
@keytype_window.show
@keyitems_window.show
@keyitems_window.activate
end
 
def return_typeselect
@keyitems_window.unselect
@keyitems_window.clear
@keyitems_window.deactivate
@keytype_window.activate
end
 
  def create_category_window
	create_keytype_window
  end
 
  def create_item_window
	create_keyitems_window
  end
 
  def on_category_ok
	on_keytype_ok
  end
 
def on_confirm
	show_keyinfo
  end
 
  def update_help
	@help_window.set_item(item)
  end
 
def make_key_list
keys = []
$game_keysystem.get_items.each do |key|
  keys.push(key) unless key.amount <= 0
  end
end
 
end #Scene_Keys
 
# =============================================================================
# ? Scene_Menu
# =============================================================================
class Scene_Menu < Scene_MenuBase
  alias redclaw_keysys create_command_window
 
  def command_keys
	SceneManager.call(Scene_Keys)
  end
 
  def create_command_window
	redclaw_keysys
	@command_window.set_handler(:keys, method(:command_keys))
  end
end #Scene_Menu
zum Lesen den Text mit der Maus markieren


Ich habe jetzt eigentlich nur noch zwei pendente Fragen :3
Gerade habe ich noch mit der letzten Window-Klasse angefangen. (Window_Keyinfo)
Das wird das Fenster wo schlussendlich die genaueren Infos zu den Keys, Cards etc.. angezeigt werden.
Bei Zeile 480 habe ich eine draw_picture Methode definiert.
Die funktioniert zwar, jedoch würde ich gerne die grösse des Bildes vorbestimmen und wenn es grösser ist soll es entsprechend verkleinert werden.
Ist das irgendwie einfach möglich?

Die andere Frage geht um die von mir erstelle Klasse Scene_KeysBase.
Besser gesagt dürfte der Fehler irgendwo bei Zeile 606 liegen.
Ich habe da bereits den entsprechenden Handler hinzugefügt

Ruby Quellcode

1
keyinfo_window.set_handler(:cancel, 	method(:close_keyinfo))

Und die Methode ist auch definiert.

Ruby Quellcode

1
2
3
4
5
6
def close_keyinfo
@keyinfo.window.hide
@keytype_window.show
@keyitems_window.show
@keyitems_window.activate
end


Vielleicht ist der Fehler auch doch wo anders ich kann es nicht mit Sicherheit sagen (sonst hätte ichs ja gefunden :S)
Jedenfalls passiert nichts wenn man ESC drückt und ich weiss nicht wieso grad :/
Signatur folgt...

3

Sonntag, 12. März 2017, 19:49

Hallo. Wieso ist dein Script denn so komisch bzw. teilweise garnicht eingerückt? Finde die Lesbarkeit des Codes nicht so gut.

Was mir spontan auffällt, ist die Eigenheit, dass Du für die Keys/Cards keine Klassen hast, sondern eine key-value-Map. Weswegen? Es wäre doch viel mehr im Sinne der OOP, wenn Du sowas wie das folgende machen würdest. Das was Du machst erinnert eher an JavaScript-Code, oder noch an die alten Structs aus C, aber nicht an Rubycode.
Spoiler: Code

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
module REDCLAW
  class Key
    def initialize( name, description, icon_index=0 )
      @id = -1
      @name = name
      @description = description
      @icon_index = icon_index
      @consumable = false
    end
    attr_accessor( :id, :name, :icon_index, :description, :consumable )
  end
end
 
module REDCLAW
  module KEYSIS
    KEYS = [nil]
  end
end
 
k = REDCLAW::Key.new( "Masterkey", "The best key at all", 1 )
k.id = 1
REDCLAW::KEYSIS::KEYS[1] = k
zum Lesen den Text mit der Maus markieren


Aber zu deinen Fragen:

Zitat

Die funktioniert zwar, jedoch würde ich gerne die grösse des Bildes vorbestimmen und wenn es grösser ist soll es entsprechend verkleinert werden.
Ist das irgendwie einfach möglich?

Ja. Du kannst folgendes machen:

Ruby Quellcode

480
481
482
483
484
485
486
487
488
489
490
491
def too_big?( rect )
  rect.width > contents.rect or rect.height > contents.height
end
 
def draw_picture(x, y, enabled = true)
  bitmap = Bitmap.new(picture_path)
  if too_big?( bitmap.rect )
    contents.stretch_blt( contents.rect, bitmap, bitmap.rect, enabled ? 255 : translucent_alpha)
  else
    contents.blt(x, y, bitmap, bitmap.rect, enabled ? 255 : translucent_alpha)
  end
end


Zitat

Jedenfalls passiert nichts wenn man ESC drückt und ich weiss nicht wieso grad :/

Die Handler werden nur abgearbeitet, wenn das Fenster aktiv ist. Setz das Info-Fenster mal auf active=true und schau, ob es dann klappt.

Redclaw

Rekrut

  • »Redclaw« ist der Autor dieses Themas

Motto: Beat down your enemy, you are your only true enemy!

  • Nachricht senden

4

Sonntag, 12. März 2017, 20:30

Also erstmal danke sehr für deine ausführliche Anwort :D

Zitat

Hallo. Wieso ist dein Script denn so komisch bzw. teilweise garnicht eingerückt? Finde die Lesbarkeit des Codes nicht so gut.
Ich denke das liegt daran, dass ich zwischen Maker und Notepad++ gewechselt habe was das ganze bisschen deformiert hat..
Werde aufjedenfall noch dafür sorgen, dass das noch ordentlich formatiert ist bis zum Ende :)

Zitat

Was mir spontan auffällt, ist die Eigenheit, dass Du für die Keys/Cards
keine Klassen hast, sondern eine key-value-Map. Weswegen? Es wäre doch
viel mehr im Sinne der OOP, wenn Du sowas wie das folgende machen
würdest. Das was Du machst erinnert eher an JavaScript-Code, oder noch
an die alten Structs aus C, aber nicht an Rubycode.
Ich habe mir gedacht, dass das nicht wirklich so schön ist für Ruby. Die Sache ist einfach die, ich will das Script gut anpassbar machen also wenn man jetzt einen neuen Typ will muss man aktuell nur den Array der Typen mit den zwei benötigten Hashes erweitern. Wäre es denn irgendwie möglich solche Klassen dynamisch zu erzeugen oder wirds dann schon kompliziert?

Das mit dem resizen habe ich gerade getestet aber komischerweise erhalte ich nen Fehler.
Bild
Vermutlich mache ich aber etwas falsch bin mit der Konzentration glaub am Ende.

Zitat

Die Handler werden nur abgearbeitet, wenn das Fenster aktiv ist. Setz
das Info-Fenster mal auf active=true und schau, ob es dann klappt.
Das war echt ein Flüchtigkeitsfehler, ich dachte ich hätte activate aufgerufen doch dem war nicht so. Das funktioniert jetzt :)
Signatur folgt...

5

Sonntag, 12. März 2017, 20:33

Zitat

Das mit dem resizen habe ich gerade getestet aber komischerweise erhalte ich nen Fehler.

Was steht denn in der Fehlerzeile? Scheinbar stimmt ja eins der Argumente beim Methodenaufruf nicht.

Zitat

Die Sache ist einfach die, ich will das Script gut anpassbar machen also wenn man jetzt einen neuen Typ will muss man aktuell nur den Array der Typen mit den zwei benötigten Hashes erweitern. Wäre es denn irgendwie möglich solche Klassen dynamisch zu erzeugen oder wirds dann schon kompliziert?

Wofür ist der Typ denn da? Macht der tatsächlich einen Unterschied bei den Attributen (so wie die Typen: Item, Waffe, Rüstung)?

Redclaw

Rekrut

  • »Redclaw« ist der Autor dieses Themas

Motto: Beat down your enemy, you are your only true enemy!

  • Nachricht senden

6

Sonntag, 12. März 2017, 20:44

Zitat

Was steht denn in der Fehlerzeile? Scheinbar stimmt ja eins der Argumente beim Methodenaufruf nicht.
Also die Fehlerzeile ist die von deiner geposteten Methode too_big?

Ruby Quellcode

1
rect.width > contents.rect or rect.height > contents.height


Ich denke der Methodenaufruf sollte doch stimmen, habe den jetzt nicht mehr geändert (oder ist genau das das Problem?).

Ruby Quellcode

1
draw_picture(0,0)


Das dritte Argument benötigt es ja nicht weil das ja ein optionales ist und standardmässig dann true genommen wird, oder versteh ich da jetzt etwas falsch?

Edit: Noch um dir die Frage zu beantworten mit dem Typ, eigentlich ist es nicht so besonderes ich dachte nur dass man das irgendwie so besser kategorisieren kann.
Ich habe jetzt halt einfach Keys und Cards definiert aber man könnte vllt auch sowas wie Batch oder so hinzufügen. Naja vllt ist es doch weniger sinnvoll wenn ich es mir so überlege.
Signatur folgt...

7

Sonntag, 12. März 2017, 20:54

"contents.rect" Upps. Quatsch. Da gehört natürlich width hin. Wir wollen ja schon die gleichen Attribute vergleichen. War ein vertipper.

Zitat

Noch um dir die Frage zu beantworten mit dem Typ, eigentlich ist es nicht so besonderes ich dachte nur dass man das irgendwie so besser kategorisieren kann.
Ich habe jetzt halt einfach Keys und Cards definiert aber man könnte vllt auch sowas wie Batch oder so hinzufügen. Naja vllt ist es doch weniger sinnvoll wenn ich es mir so überlege.
Geht da nicht sowas in Richtung "Gegenstandsart", wie man es auch bei den Items hat? Da wird ja auch nur eine Zahlenkonstante gespeichert (1=Normal, 2=Wichtiger Gegenstand).

Wieso benutzt Du für die Keys/Cards eigentlich keine Items aus der Database, die Du halt nicht im Menü anzeigst aber halt sehr handhabbar über die Database definieren kannst.

Spoiler: RPG::Item Definition

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class RPG::Item < RPG::UsableItem
  def initialize
    super
    @scope = 7
    @itype_id = 1
    @price = 0
    @consumable = true
  end
  def key_item?
    @itype_id == 2
  end
  attr_accessor :itype_id
  attr_accessor :price
  attr_accessor :consumable
end
zum Lesen den Text mit der Maus markieren

Redclaw

Rekrut

  • »Redclaw« ist der Autor dieses Themas

Motto: Beat down your enemy, you are your only true enemy!

  • Nachricht senden

8

Sonntag, 12. März 2017, 21:19

Zitat

"contents.rect" Upps. Quatsch. Da gehört natürlich width hin. Wir wollen ja schon die gleichen Attribute vergleichen. War ein vertipper.

Hätte mir aber auch auffallen müssen... Da merkt man ich brauch ne Pause.

Zitat

Wieso benutzt Du für die Keys/Cards eigentlich keine Items aus der
Database, die Du halt nicht im Menü anzeigst aber halt sehr handhabbar
über die Database definieren kannst.

Ich finde den Ansatz echt gut, für die von mir bereits beschriebene Situation wäre das wohl auch viel einfacher gewesen.
Mir ist gerade wieder eingefallen wieso ich mich dazu entschieden habe es von der Datenbank losgelöst zu machen. (Vergesse schon meine eigenen Pläne, gut hab ich Noitzen gemacht)
Ich habe halt bei dem einen Projekt auch ein CraftingScript im Einsatz und viele Gegenstände sind eigentlich nur für Rezepte benötigt, das wird meine Items schon sehr voll machen.
Dazu kommt aber auch noch, dass ich noch weitere Attribute hinzuzufügen will, die dann doch über die der normalen Items hinausgehen.
Ausserdem mache ich eventuell später noch ein Add-on dazu welches auch eine erweiterte Zutrittsverwaltung ermöglicht.
Da könnte man dann beispielsweise verschiedene Zutrittsgruppen erstellen, die mehrere Türen enthalten oder so.
Diese Zutrittsgruppen können dann beispielsweise einer Accesscard zugeordnet werden.

Vielleicht werde ich auch das direkte einsetzen vom Menü aus der Schlüssel, durch Verwendung von notes in Events einbauen, sodass es dann möglich ist nur irgendwie einen Tag mit der KeyID reinzuschreiben und dann wird beim Aufruf des Schlüssels automatisch geprüft ob sich der Spieler in Reichweite befindet?

Wahrscheinlich ist es selbst dann nicht unbedingt notwendig, das so zu lösen wie ich es getan habe, aber ich wollte auch einfach mal bisschen besser Scripten lernen und ich glaube dafür habe ich meine Zeit nicht verschwendet :D
Signatur folgt...

9

Sonntag, 12. März 2017, 21:37

Zitat

Mir ist gerade wieder eingefallen wieso ich mich dazu entschieden habe es von der Datenbank losgelöst zu machen. (Vergesse schon meine eigenen Pläne, gut hab ich Noitzen gemacht)
Ich habe halt bei dem einen Projekt auch ein CraftingScript im Einsatz und viele Gegenstände sind eigentlich nur für Rezepte benötigt, das wird meine Items schon sehr voll machen.

Auf lange Sicht bastelst Du dir vielleicht einen eigenen Editor ähnlich der Database, die dann deine eigene /Data/Key.rvdata2 erzeugt, die Du dann im Script nur einliest. Fände ich hübscher, als alles als Text in das Script zu schreiben. (Besonders wenn Du später über 50 Schlüssel/Zutaten hast.)
Die Items.rvdata2 zum Beispiel enthält auch nur einen Array voll RPG::Item-Objekten, der bei Spielstart ausgelesen und in die Variable $data_items gespeichert wird.

Zitat

Wahrscheinlich ist es selbst dann nicht unbedingt notwendig, das so zu lösen wie ich es getan habe, aber ich wollte auch einfach mal bisschen besser Scripten lernen und ich glaube dafür habe ich meine Zeit nicht verschwendet :D
Learning by doing ist doch super. So habe ich auch mit dem RMXP und RGSS1 angefangen.

Redclaw

Rekrut

  • »Redclaw« ist der Autor dieses Themas

Motto: Beat down your enemy, you are your only true enemy!

  • Nachricht senden

10

Sonntag, 12. März 2017, 21:51

Zitat

Auf lange Sicht bastelst Du dir vielleicht einen eigenen Editor ähnlich der Database, die dann deine eigene /Data/Key.rvdata2 erzeugt, die Du dann im Script nur einliest. Fände ich hübscher, als alles als Text in das Script zu schreiben. (Besonders wenn Du später über 50 Schlüssel/Zutaten hast.)
Die Items.rvdata2 zum Beispiel enthält auch nur einen Array voll RPG::Item-Objekten, der bei Spielstart ausgelesen und in die Variable $data_items gespeichert wird.

Wow ja das wäre wirklich um einiges besser. Ich werde mir das merken. Könnte das später wirklich umsetzen :D
Ich habe mir auch mal noch ne Idee aufgeschrieben für ein Archivsystem. Dass es ermöglicht, Dokumente, Bilder, Audio oder Videos einzusehen, die man vorher im Spiel (auf welche Art und weise auch immer) erhalten hat. Wäre zum Beispiel ne gute Idee für RPGs bei denen man solche Infos sammeln muss um die Geschichte besser zu verstehen oder ein Rätsel zu lösen etc :)
Das könnte ich dann aber eigentlich auch dem Script hinzufügen (eher als Add-on aber).

Zitat

Learning by doing ist doch super. So habe ich auch mit dem RMXP und RGSS1 angefangen.

Das stimmt, ich bin leider ohnehin nicht der Typ Mensch der gut mit Theorien lernt.
Ich muss ausprobieren und aus meinen Fehlern lernen aber dann kann ich es dann auch :)
Signatur folgt...

Social Bookmarks