• Login

1

Thursday, April 11th 2013, 1:13am

Neo Save System VI mit Autosave VX verbinden

Hi
ich habe versucht die Scripts Neo Save System VI und AutoSave VX zu verbinden.
Meine Vorlage ist ein AutoSave VX + Neo Save System III Script vom AutoSave VX Ersteller.

Mein bisheriger Status ist dieses Script:
Spoiler

Ruby Source code

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
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
=begin
                      AutoSave VX
 
Author: BulleXt(bulletxt@gmail.com)
Version: 0.1
Date: 06/07/2009
 
Description:
This script by default will automatically save when you do a map transfer,
after winning a battle and after exiting menu.
You can also manually call an autosave inside an event by simply doing a
call script like this:
Auto_Save.new
The script doesn't disable normal saving system so player can still save on his
slots, he will not be able to overwrite the autosave slot.
The script also lets you set how many saving slots you want.
=end
 
 
#This is the autosave slot number
SAVE_NUMBER = 1
 
#This is an ID switch, if ON it disables the autosave on map transfer
SAVE_ON_MAP_TRANSFER = 1
 
#This is an ID switch, if ON it disables the autosave after winning a battle
SAVE_AFTER_WINNING_BATTLE = 2
 
#This is an ID switch, if ON it disables the autosave after closing Menu
SAVE_AFTER_CLOSING_MENU = 3
 
 
#==========================================================================
# ● [VX] ◦ Neo Save System VI ◦ □
#---------------------------------------------------------------------------
# ◦ Author: Woratana [woratana@hotmail.com]
# ◦ Thaiware RPG Maker Community
# ◦ Last Updated:
# ◦ Version: III -> VI (By Helladen) 
# ◦ Screenshot image credit Andreas21, and Cybersam
# ◦ Commerical usage ask Wortana.
#---------------------------------------------------------------------------
# ◦ Log VI:
# - Cleaned up comments and code format.
# - Added corresponding map variables system to MAP_NO_NAME.
# - Added where you can use premade images that use a map's name.
#---------------------------------------------------------------------------
# ◦ Log V:
# - Screenshot support for those who want tone/weather/sprites.
# - Added an option to stay in save screen after you save the game.
#---------------------------------------------------------------------------
# ◦ Log IV:
# - New addition for hiding map names. You can control the switch to
#   allow MAP_NO_NAME_LIST to work or not.
# - Revised some of the settings and script organization.
# - Added an option to disable the vocab::Gold text right of the number.
# - Added an option to use default opacity or not.
# - Swap tile compatibility support.
#---------------------------------------------------------------------------
# ◦ Log III:
# - Changed back to draw tile map for save image, don't need any image.
# - For drawing tile map, the characters won't show on the tile map.
#---------------------------------------------------------------------------
# ◦ Log II:
# - Screenshot DLL is not work with Vista Aero, so I remove it
#   and use image for each map instead of screenshot.
# - Actor's level in last version (V.1) is incorrect.
#---------------------------------------------------------------------------
# ◦ Features:
# - Unlimited save slots, you can choose max save slot
# - Many configuration options
# - Swap tile support
# - You can use image for scene's background
# - Choose your save file's name, and folder to store save files
# - Choose to show only information you want
# - Editable text for information's title
# - Draw tile map for map that player is currently on.
# - Remove text you don't want from map's name (e.g. tags for special script)
# - Choose map that you don't want to show the name on
# - Include save confirmation window before overwrite old save
#===========================================================================
 
module Wora_NSS Wora_NSS
  #==========================================================================
  # * START NEO SAVE SYSTEM - SETUP
  #--------------------------------------------------------------------------
  OPACITY_DEFAULT = true # This will use the default opacity for windows.
  # Please note that this will affect both opacitys below.
 
  NSS_WINDOW_OPACITY = 255 # All windows' opacity (Lowest 0 - 255 Highest).
 
  # You can change this to 0 in case you want to use image for background.
  NSS_IMAGE_BG = '' # Background image file name, it must be in folder picture
  #                   use '' for no background.
  NSS_IMAGE_BG_OPACITY = 255 # Opacity for background image.
 
  # If you use the screenshot method this does not matter.
  SWAP_TILE = true # Make this false if you don't use the swap_tile script
  SWAP_TILE_SWITCH = 84 # The switch needs to be the same as your swap tile
  #                       switch, but if SWAP_TILE is false it does not matter.
 
  # If this is true it will screenshot the map, if false it will draw it.
  SCREENSHOT_IMAGE = true # Drawing the map is good because it doesn't require
  # a .DLL or images for the screenshot, and it will have tone and
  # weather. If you are using SwapXT and this value is false you need to turn
  # on swap tile.
 
  # Do you want to use your own custom images for each map via map name.
  PREMADE_IMAGE = false # If this is true it sets its priority over
  #                       screenshots/etc.
 
  # Image type for screenshot '.bmp', or '.jpg', or '.png'.
  IMAGE_FILETYPE = '.png'
 
  # If this is true then the scene will not change when you save the game. 
  SCENE_CHANGE = true # Changes scene to map instead of remaining in Save screen.
 
  MAX_SAVE_SLOT = 20 # Max save slots.
  SLOT_NAME = 'SLOT {id}'
 
  # Name of the slot (show in save slots list), use {id} for slot ID.
  SAVE_FILE_NAME = 'Save {id}.rvdata'
  # Save file name, you can also change its file type from .rvdata to other.
 
  # Use {id} for save slot ID.
  SAVE_PATH = '' # Path to store save file, e.g. 'Save/' or '' (for game folder).
  SAVED_SLOT_ICON = 133 # Icon Index for saved slot.
 
  EMPTY_SLOT_ICON = 141 # Icon Index for empty slot.
  EMPTY_SLOT_TEXT = 'Empty' # Text to show for empty slot's data.
 
  DRAW_GOLD = true # Draw Gold.
  DRAW_PLAYTIME = true # Draw playtime.
  DRAW_LOCATION = true # Draw location.
  DRAW_FACE = true # Draw actor's face.
  DRAW_LEVEL = true # Draw actor's level.
  DRAW_NAME = true # Draw actor's name.
  DRAW_TEXT_GOLD = false # Draw the vocab::Gold text to the right of the number.
 
  PLAYTIME_TEXT = 'Play Time: '
  GOLD_TEXT = 'Gold: '
  LOCATION_TEXT = 'Location: '
  LV_TEXT = 'Lv. '
 
  MAP_NAME_TEXT_SUB = %w{}
  # Text that you want to remove from map name,
  # e.g. %w{[LN] [DA]} will remove text '[LN]' and '[DA]' from map name.
 
  # Do we want to use corresponding variables for each map number in MAP_NO_NAME_LIST?
  MAP_NO_NAME_VARIABLE = true # You just apply the value one to the variable which
                              # is the map number to change it from MAP_NO_NAME.
 
  MAP_NO_NAME_LIST = [2] # ID of Map that will not show map name, e.g. [1,2,3].
  MAP_NO_NAME = '???' # What you will use to call the map in the no name list.
 
  # This is a switch that can activate or deactivate maps from being displayed as
  # MAP_NO_NAME. If it is off then maps will return back to normal.
  MAP_NO_NAME_SWITCH = 95 # This switch has to be on for MAP_NO_NAME_LIST to work.
 
  MAP_BORDER = Color.new(0,0,0,200) # Map image border color (R,G,B,Opacity).
  FACE_BORDER = Color.new(0,0,0,200) # Face border color.
 
  # Save confirmation window
  SFC_Text_Confirm = 'Confirm to save' # Text to confirm to save file.
  SFC_Text_Cancel = 'Cancel' # Text to cancel to save.
  SFC_Window_Width = 200 # Width of Confirmation Window.
  SFC_Window_X_Offset = 0 # Move Confirmation Window horizontally.
  SFC_Window_Y_Offset = 0 # Move Confirmation Window vertically.
 
  #-------------------------------------------------------------------------
  # END NEO SAVE SYSTEM - SETUP (Edit below at your own risk)
  #=========================================================================
 
  #-------------------------------------------------------------
  # Screenshot V2 by Andreas21 and Cybersam
  #-------------------------------------------------------------
  @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), ''
  @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
  @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' 
  module_function
 
  def self.shot(file_name)
    case IMAGE_FILETYPE
      when '.bmp'; typid = 0
      when '.jpg'; typid = 1
      when '.png'; typid = 2
    end
 
    # Get Screenshot
    filename = file_name + IMAGE_FILETYPE
    @screen.call(0, 0, Graphics.width, Graphics.height, filename, self.handel,
    typid)
  end
 
  def self.handel
    game_name = "\0" * 256
    @readini.call('Game','Title','',game_name,255,".\\Game.ini")
    game_name.delete!("\0")
 
    return @findwindow.call('RGSS Player',game_name)
  end
end
 
class Auto_Save < Scene_File
  def initialize
    do_save
  end
end
 
class Scene_File < Scene_Base
  include Wora_NSS
  attr_reader :window_slotdetail
 
  #-------------------------------------------------------------------------
  # * Start processing
  #-------------------------------------------------------------------------
  def start
    super
 
    create_menu_background
 
    if NSS_IMAGE_BG != ''
      @bg = Sprite.new
      @bg.bitmap = Cache.picture(NSS_IMAGE_BG)
      @bg.opacity = NSS_IMAGE_BG_OPACITY
    end
 
    @help_window = Window_Help.new
    command = []
 
    (1..MAX_SAVE_SLOT).each do |i|
    	#command << SLOT_NAME.clone.gsub!(/\{ID\}/i) { i-1 }
 
    end
 
    @window_slotdetail = Window_NSS_SlotDetail.new
    @window_slotlist = Window_SlotList.new(160, command)
    @window_slotlist.y = @help_window.height
    @window_slotlist.height = Graphics.height - @help_window.height
 
    if !OPACITY_DEFAULT
      @help_window.opacity = NSS_WINDOW_OPACITY
      @window_slotdetail.opacity = @window_slotlist.opacity = NSS_WINDOW_OPACITY
    end
 
    # Create folder for save file
    if SAVE_PATH != ''
      Dir.mkdir(SAVE_PATH) if !FileTest.directory?(SAVE_PATH)
    end
 
    if @saving
      @index = $game_temp.last_file_index
      @help_window.set_text(Vocab::SaveMessage)
    else
      @index = self.latest_file_index
      @help_window.set_text(Vocab::LoadMessage)
 
      (1..MAX_SAVE_SLOT).each do |i|
        @window_slotlist.draw_item(i-1, false) if !@window_slotdetail.file_exist?(i)
      end
    end
 
    @window_slotlist.index = @index
 
    # Draw information
    @last_slot_index = @window_slotlist.index
    @window_slotdetail.draw_data(@last_slot_index + 1)
  end
 
  #--------------------------------------------------------------------------  
  # * Termination Processing
  #--------------------------------------------------------------------------
  def terminate
    super
 
    dispose_menu_background
 
    unless @bg.nil?
      @bg.bitmap.dispose
      @bg.dispose
    end
 
    @window_slotlist.dispose
    @window_slotdetail.dispose
    @help_window.dispose
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
 
    if !@confirm_window.nil?
      @confirm_window.update
 
      if Input.trigger?(Input::C)
        if @confirm_window.index == 0
          determine_savefile
          @confirm_window.dispose
          @confirm_window = nil
        else
          Sound.play_cancel
          @confirm_window.dispose
          @confirm_window = nil
        end
      elsif Input.trigger?(Input::B)
        Sound.play_cancel
        @confirm_window.dispose
        @confirm_window = nil
      end
    else
      update_menu_background
      @window_slotlist.update
 
      if @window_slotlist.index != @last_slot_index
        @last_slot_index = @window_slotlist.index
        @window_slotdetail.draw_data(@last_slot_index + 1)
      end
 
      @help_window.update
      update_savefile_selection
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Save File Selection
  #--------------------------------------------------------------------------
  def update_savefile_selection
    if Input.trigger?(Input::C)
      if @saving and @window_slotdetail.file_exist?(@last_slot_index + 1)
        Sound.play_decision
        text1 = SFC_Text_Confirm
        text2 = SFC_Text_Cancel
        @confirm_window = Window_Command.new(SFC_Window_Width,[text1,text2])
        @confirm_window.x = ((544 - @confirm_window.width) / 2) + SFC_Window_X_Offset
        @confirm_window.y = ((416 - @confirm_window.height) / 2) + SFC_Window_Y_Offset
      else
        determine_savefile
      end
    elsif Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    end
  end
 
  #--------------------------------------------------------------------------
  # * Execute Save
  #--------------------------------------------------------------------------
  def do_save
    if SCREENSHOT_IMAGE
      File.rename(SAVE_PATH + 'temp' + IMAGE_FILETYPE,
      make_filename(@last_slot_index).gsub(/\..*$/){ '_ss' } + IMAGE_FILETYPE)  
    end  
 
 
    #if true, player is saving from inside menu
    if @saving
      file = File.open(make_filename(@last_slot_index), "wb")
    else
      #if here player has done a manual Auto_Save.new call from event
      s = SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { SAVE_NUMBER.to_s }
      file = File.open( s , "wb")
    end
 
    write_save_data(file)
    file.close   
 
    # Alter the scene after the saving is done
    if SCENE_CHANGE
 	if @saving 
     	  $scene = Scene_Map.new 
	end
    else
    	if @saving	
          $scene = Scene_File.new(true, false, false) 
	end
    end
  end
 
  #--------------------------------------------------------------------------
  # * Execute Load
  #--------------------------------------------------------------------------
  def do_load
    file = File.open(make_filename(@last_slot_index), "rb")
    read_save_data(file)
    file.close
    $scene = Scene_Map.new
    RPG::BGM.fade(1500)
    Graphics.fadeout(60)
    Graphics.wait(40)
    @last_bgm.play
    @last_bgs.play
  end
 
  #--------------------------------------------------------------------------
  # * Confirm Save File
  #--------------------------------------------------------------------------
  def determine_savefile
 
    if @last_slot_index + 1 == SAVE_NUMBER
      saving_not_allowed if @saving
      return  if @saving
    end
 
    if @saving
      Sound.play_save
      do_save
    else
      if @window_slotdetail.file_exist?(@last_slot_index + 1)
        Sound.play_load
        do_load
      else
        Sound.play_buzzer
        return
      end
    end
 
    $game_temp.last_file_index = @last_slot_index
  end
 
  #window warning player can't save on auto save slot
  def saving_not_allowed
    Sound.play_buzzer
    b = Bitmap.new(340,60) 
    b.draw_text(0, 20,340, 20, "You can't save on the Auto Save slot.") 
    w = Window_Message.new
    w.contents = b
    w.width = 380
    w.height = 100
    w.visible = true
    w.openness = 255
    w.x = 100
    w.y = 180
    w.back_opacity = 255
    w.opacity = 255
    w.update
    Graphics.wait(180)
    b.dispose
    w.dispose
    w = nil
    b = nil
  end 
 
  #--------------------------------------------------------------------------
  # * Create Filename
  #     file_index : save file index (0-3)
  #--------------------------------------------------------------------------
  def make_filename(file_index)
    return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index + 1).to_s }
  end
  #--------------------------------------------------------------------------
  # * Select File With Newest Timestamp
  #--------------------------------------------------------------------------
  def latest_file_index
    latest_index = 0
    latest_time = Time.at(0)
    (1..MAX_SAVE_SLOT).each do |i|
      file_name = make_filename(i - 1)
      next if !@window_slotdetail.file_exist?(i)
      file_time = File.mtime(file_name)
      if file_time > latest_time
        latest_time = file_time
        latest_index = i - 1
      end
    end
    return latest_index
  end
 
class Window_SlotList < Window_Command
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index, enabled = true)
    rect = item_rect(index)
    rect.x += 4
    rect.width -= 8
    icon_index = 0
    self.contents.clear_rect(rect)
 
    if $scene.window_slotdetail.file_exist?(index + 1)
      icon_index = Wora_NSS::SAVED_SLOT_ICON
    else
      icon_index = Wora_NSS::EMPTY_SLOT_ICON
    end
 
    if !icon_index.nil?
      rect.x -= 4
      draw_icon(icon_index, rect.x, rect.y, enabled) # Draw Icon
      rect.x += 26
      rect.width -= 20
    end
 
    self.contents.clear_rect(rect)
    self.contents.font.color = normal_color
    self.contents.font.color.alpha = enabled ? 255 : 128
    if index + 1 != SAVE_NUMBER
    	self.contents.draw_text(rect, @commands[index]) 
    end
    if index + 1 == SAVE_NUMBER
    	self.contents.draw_text(rect, "Autosave") 
    end
  end
 
  def cursor_down(wrap = false)
    if @index < @item_max - 1 or wrap
      @index = (@index + 1) % @item_max
    end
  end
 
  def cursor_up(wrap = false)
    if @index > 0 or wrap
      @index = (@index - 1 + @item_max) % @item_max
    end
  end
end
 
class Window_NSS_SlotDetail < Window_Base
  include Wora_NSS
 
  def initialize
    super(160, 56, 384, 360)
 
    @data = []
    @exist_list = []
    @bitmap_list = {}
    @map_name = []
  end
 
  def dispose
    dispose_tilemap
    super
  end
 
  def draw_data(slot_id)
    contents.clear # 352, 328
    dispose_tilemap
 
    load_save_data(slot_id) if @data[slot_id].nil?
      if @exist_list[slot_id]
        save_data = @data[slot_id]
        contents.fill_rect(0,30,352,152, MAP_BORDER)
 
        if PREMADE_IMAGE
          bitmap = get_bitmap("Graphics/Save/" + @data[slot_id]['map_name'] + IMAGE_FILETYPE)
          rect = Rect.new((Graphics.width-348)/2,(Graphics.height-156)/2,348,156)
          contents.blt(2,32,bitmap,rect)
        elsif SCREENSHOT_IMAGE and save_data['ss']
          bitmap = get_bitmap(save_data['ss_path'])
          rect = Rect.new((Graphics.width-348)/2,(Graphics.height-156)/2,348,156)
          contents.blt(2,32,bitmap,rect)
        elsif SWAP_TILE and $game_switches[SWAP_TILE_SWITCH]
          create_swaptilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
        else
          create_tilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
        end
 
        if DRAW_GOLD
          gold_textsize = contents.text_size(save_data['gamepar'].gold).width
          goldt_textsize = contents.text_size(GOLD_TEXT).width  
          contents.font.color = system_color
          contents.draw_text(0, 0, goldt_textsize, WLH, GOLD_TEXT)
          contents.font.color = normal_color
          contents.draw_text(goldt_textsize, 0, gold_textsize, WLH, save_data['gamepar'].gold)  
 
          if DRAW_TEXT_GOLD
            contents.draw_text(goldt_textsize + gold_textsize, 0, 200, WLH, Vocab::gold)
 
          else
            gold_textsize = 0
            goldt_textsize = 0                
          end
        end
 
        if DRAW_PLAYTIME
          hour = save_data['total_sec'] / 60 / 60
          min = save_data['total_sec'] / 60 % 60
          sec = save_data['total_sec'] % 60
          time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
          pt_textsize = contents.text_size(PLAYTIME_TEXT).width
          ts_textsize = contents.text_size(time_string).width
          contents.font.color = system_color
          contents.draw_text(contents.width - ts_textsize - pt_textsize, 0,
          pt_textsize, WLH, PLAYTIME_TEXT)
          contents.draw_text(goldt_textsize + gold_textsize,0,200,WLH, Vocab::gold)
          contents.font.color = normal_color
          contents.draw_text(0, 0, contents.width, WLH, time_string, 2)
        end
 
        if DRAW_LOCATION
          lc_textsize = contents.text_size(LOCATION_TEXT).width
          mn_textsize = contents.text_size(save_data['map_name']).width
          contents.font.color = system_color
          contents.draw_text(0, 190, contents.width, WLH, LOCATION_TEXT)
          contents.font.color = normal_color
          contents.draw_text(lc_textsize, 190, contents.width, WLH, save_data['map_name'])
        end
 
        # Draw level & name
        save_data['gamepar'].members.each_index do |i|
          actor = save_data['gameactor'][save_data['gamepar'].members[i].id]
          face_x_base = (i*80) + (i*8)
          face_y_base = 216
          lvn_y_plus = 10
          lv_textsize = contents.text_size(actor.level).width
          lvt_textsize = contents.text_size(LV_TEXT).width
 
        if DRAW_FACE
          contents.fill_rect(face_x_base, face_y_base, 84, 84, FACE_BORDER)
          draw_face(actor.face_name, actor.face_index, face_x_base + 2,
          face_y_base + 2, 80)
        end
 
        if DRAW_LEVEL
          contents.font.color = system_color
          contents.draw_text(face_x_base + 2 + 80 - lv_textsize - lvt_textsize,
          face_y_base + 2 + 80 - WLH + lvn_y_plus, lvt_textsize, WLH, LV_TEXT)
          contents.font.color = normal_color
          contents.draw_text(face_x_base + 2 + 80 - lv_textsize,
          face_y_base + 2 + 80 - WLH + lvn_y_plus, lv_textsize, WLH, actor.level)
        end
 
        if DRAW_NAME
          contents.draw_text(face_x_base, face_y_base + 2 + 80 + lvn_y_plus - 6, 84,
          WLH, actor.name, 1)
        end
      end
    else
      contents.draw_text(0,0, contents.width, contents.height - WLH, EMPTY_SLOT_TEXT, 1)
    end
  end
 
  def load_save_data(slot_id)
    file_name = make_filename(slot_id)
 
    if file_exist?(slot_id) or FileTest.exist?(file_name)
      @exist_list[slot_id] = true
      @data[slot_id] = {}
 
      # Start load data
      file = File.open(file_name, "r")
      @data[slot_id]['time'] = file.mtime
      @data[slot_id]['char'] = Marshal.load(file)
      @data[slot_id]['frame'] = Marshal.load(file)
      @data[slot_id]['last_bgm'] = Marshal.load(file)
      @data[slot_id]['last_bgs'] = Marshal.load(file)
      @data[slot_id]['gamesys'] = Marshal.load(file)
      @data[slot_id]['gamemes'] = Marshal.load(file)
      @data[slot_id]['gameswi'] = Marshal.load(file)
      @data[slot_id]['gamevar'] = Marshal.load(file)
      @data[slot_id]['gameselfvar'] = Marshal.load(file)
      @data[slot_id]['gameactor'] = Marshal.load(file)
      @data[slot_id]['gamepar'] = Marshal.load(file)
      @data[slot_id]['gametro'] = Marshal.load(file)
      @data[slot_id]['gamemap'] = Marshal.load(file)
      @data[slot_id]['total_sec'] = @data[slot_id]['frame'] / Graphics.frame_rate
 
      # Save the image
      if SCREENSHOT_IMAGE
        @data[slot_id]['ss_path'] = file_name.gsub(/\..*$/){'_ss'} + IMAGE_FILETYPE
        @data[slot_id]['ss'] = FileTest.exist?(@data[slot_id]['ss_path'])
      end
 
      @data[slot_id]['map_name'] = get_mapname(@data[slot_id]['gamemap'].map_id)
      file.close
    else
      @exist_list[slot_id] = false
      @data[slot_id] = -1
    end
  end
 
  def make_filename(file_index)
    return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index).to_s }
  end
 
  def file_exist?(slot_id)
    return @exist_list[slot_id] if !@exist_list[slot_id].nil?
 
    @exist_list[slot_id] = FileTest.exist?(make_filename(slot_id))
 
    return @exist_list[slot_id]
  end
 
  def get_bitmap(path)
    if !@bitmap_list.include?(path)
      @bitmap_list[path] = Bitmap.new(path)
    end
 
    return @bitmap_list[path]
  end
 
  def get_mapname(map_id)
    if @map_data.nil?
      @map_data = load_data("Data/MapInfos.rvdata")
    end
 
    if @map_name[map_id].nil?
      if MAP_NO_NAME_LIST.include?(map_id) and $game_switches[MAP_NO_NAME_SWITCH]
        if $game_variables[map_id] == 0 or !MAP_NO_NAME_VARIABLE
          @map_name[map_id] = MAP_NO_NAME
        else
          @map_name[map_id] = @map_data[map_id].name
        end  
      else
        @map_name[map_id] = @map_data[map_id].name
      end
 
      MAP_NAME_TEXT_SUB.each_index do |i|
        @map_name[map_id].sub!(MAP_NAME_TEXT_SUB[i], '')
        @mapname = @map_name[map_id]
      end 
    end
 
    return @map_name[map_id] 
  end   
 
  def create_tilemap(map_data, ox, oy)
    @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
    @viewport.z = self.z
    @tilemap = Tilemap.new(@viewport)
    @tilemap.bitmaps[0] = Cache.system("TileA1")
    @tilemap.bitmaps[1] = Cache.system("TileA2")
    @tilemap.bitmaps[2] = Cache.system("TileA3")
    @tilemap.bitmaps[3] = Cache.system("TileA4")
    @tilemap.bitmaps[4] = Cache.system("TileA5")
    @tilemap.bitmaps[5] = Cache.system("TileB")
    @tilemap.bitmaps[6] = Cache.system("TileC")
    @tilemap.bitmaps[7] = Cache.system("TileD")
    @tilemap.bitmaps[8] = Cache.system("TileE")
    @tilemap.map_data = map_data
    @tilemap.ox = ox / 8 + 99
    @tilemap.oy = oy / 8 + 90
  end
 
  def create_swaptilemap(map_data, ox, oy)
    @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
    @viewport.z = self.z
    @tilemap = Tilemap.new(@viewport)
 
    tile1 = Cache_Swap_Tiles.swap($tileA1 + ".png") rescue nil
    tile2 = Cache_Swap_Tiles.swap($tileA2 + ".png") rescue nil
    tile3 = Cache_Swap_Tiles.swap($tileA3 + ".png") rescue nil
    tile4 = Cache_Swap_Tiles.swap($tileA4 + ".png") rescue nil
    tile5 = Cache_Swap_Tiles.swap($tileA5 + ".png") rescue nil
    tile6 = Cache_Swap_Tiles.swap($tileB + ".png") rescue nil
    tile7 = Cache_Swap_Tiles.swap($tileC + ".png") rescue nil
    tile8 = Cache_Swap_Tiles.swap($tileD + ".png") rescue nil
    tile9 = Cache_Swap_Tiles.swap($tileE + ".png") rescue nil
 
    if $tileA1 != nil
      @tilemap.bitmaps[0] = tile1
    else
      @tilemap.bitmaps[0] = Cache.system("TileA1")
    end
 
    if $tileA2 != nil
      @tilemap.bitmaps[1] = tile2
    else
      @tilemap.bitmaps[1] = Cache.system("TileA2")
    end
 
    if $tileA3 != nil
      @tilemap.bitmaps[2] = tile3  
    else
      @tilemap.bitmaps[2] = Cache.system("TileA3")
    end  
 
    if $tileA4 != nil
      @tilemap.bitmaps[3] = tile4
    else
      @tilemap.bitmaps[3] = Cache.system("TileA4")
    end
 
    if $tileA5 != nil
      @tilemap.bitmaps[4] = tile5  
    else
      @tilemap.bitmaps[4] = Cache.system("TileA5")
    end
 
    if $tileB != nil
      @tilemap.bitmaps[5] = tile6
    else
      @tilemap.bitmaps[5] = Cache.system("TileB")  
    end  
 
    if $tileC != nil
      @tilemap.bitmaps[6] = tile7
    else
      @tilemap.bitmaps[6] = Cache.system("TileC")
    end  
 
    if $tileD != nil
      @tilemap.bitmaps[7] = tile8
    else
      @tilemap.bitmaps[7] = Cache.system("TileD")  
    end
 
    if $tileE != nil
      @tilemap.bitmaps[8] = tile9
    else
      @tilemap.bitmaps[8] = Cache.system("TileE")  
    end
 
    @tilemap.map_data = map_data
    @tilemap.ox = ox / 8 + 99
    @tilemap.oy = oy / 8 + 90
  end
 
  def dispose_tilemap
    unless @tilemap.nil?
      @tilemap.dispose
      @tilemap = nil
      end
    end
  end
end
 
class Scene_Title < Scene_Base
  def check_continue
    file_name = Wora_NSS::SAVE_PATH + Wora_NSS::SAVE_FILE_NAME.gsub(/\{ID\}/i) { '*' }
    @continue_enabled = (Dir.glob(file_name).size > 0)
  end
end
 
class Scene_Map < Scene_Base
  alias wora_nss_scemap_ter terminate
 
  def terminate
    Wora_NSS.shot(Wora_NSS::SAVE_PATH + 'temp')
    wora_nss_scemap_ter
  end
end
 
###########################################################################
class Scene_Menu < Scene_Base
  #save when exiting menu
  alias auto_save_bulletxt_update_command_selection update_command_selection
  def update_command_selection    
    if Input.trigger?(Input::B)
    	if $game_switches[SAVE_AFTER_CLOSING_MENU] == false
    	    Auto_Save.new
	end 
    end
    auto_save_bulletxt_update_command_selection
  end
end
 
class Scene_Battle < Scene_Base
  #save after winning a battle
  alias auto_save_bulletxt_process_victory process_victory
  def process_victory
    auto_save_bulletxt_process_victory
    	if $BTEST == false && $game_switches[SAVE_AFTER_WINNING_BATTLE] == false
    	   Auto_Save.new 
    	end
  end
end
 
 
 
class Scene_Map < Scene_Base
  #save on map transfer
  alias auto_save_bulletxt_update_transfer_player  update_transfer_player
  def update_transfer_player
    return unless $game_player.transfer?
    auto_save_bulletxt_update_transfer_player
    if $game_switches[SAVE_ON_MAP_TRANSFER] == false
    	Auto_Save.new 
    end
  end
end
 
#======================================================================
# END - NEO SAVE SYSTEM by Woratana and Helladen
#======================================================================
highlight to read


Der folgende Fehler tritt auf, wenn ich per Auto_Save.new ein Autosave Spielstand erstellen möchte oder das Menü ist verlasse.

Script 'AutoSave_NeoSaveSystem ' line 450 NoMethodError occurred.
undefined method `+' for nil:NilClass

Das wäre folgende Stelle

Ruby Source code

1
2
3
4
5
6
7
#--------------------------------------------------------------------------
  # * Create Filename
  #     file_index : save file index (0-3)
  #--------------------------------------------------------------------------
  def make_filename(file_index)
    return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index + 1).to_s }
  end


nach etwas probieren fand ich heraus das es am + bei file_index liegt.

Dies sind die 3 Scripts die mir als Quelle dienen
Alle von dieses Scripten funktionieren seperat.

Spoiler: AutoSave_VX

Ruby Source code

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
=begin
                                  AutoSave VX
 
Author: BulleXt(bulletxt@gmail.com)
Version: 0.1
Date: 06/07/2009
 
Description:
This script by default will automatically save when you do a map transfer,
after winning a battle and after exiting menu.
You can also manually call an autosave inside an event by simply doing a
call script like this:
Auto_Save.new
The script doesn't disable normal saving system so player can still save on his
slots, he will not be able to overwrite the autosave slot.
The script also lets you set how many saving slots you want.
=end
 
#This is the autosave slot number
SAVE_NUMBER = 1
 
#this is the number of how many saving slots you want
NUMBER_OF_SAVE_SLOTS = 10
 
#This is an ID switch, if ON it disables the autosave on map transfer
SAVE_ON_MAP_TRANSFER = 1
 
#This is an ID switch, if ON it disables the autosave after winning a battle
SAVE_AFTER_WINNING_BATTLE = 2
 
#This is an ID switch, if ON it disables the autosave after closing Menu
SAVE_AFTER_CLOSING_MENU = 3
 
############################### END CONFIGURATION ##############################
 
SAVING_FILE = "Save" + SAVE_NUMBER.to_s() + ".rvdata"
SAVE_NUMBER = 1 if SAVE_NUMBER > NUMBER_OF_SAVE_SLOTS
SAVE_NUMBER = 1 if SAVE_NUMBER < 1
 
class Auto_Save < Scene_File
  def initialize
    do_save
  end
end
 
 
 
class Scene_File < Scene_Base
 
  alias auto_save_bulletxt_initialize initialize
  def initialize(saving, from_title, from_event)
    auto_save_bulletxt_initialize(saving, from_title, from_event)
    @saving_inside_menu = false
  end
 
  def start  
    super
    @file_max = NUMBER_OF_SAVE_SLOTS
    create_menu_background
    @help_window = Window_Help.new
    create_savefile_windows
    if @saving
      @index = $game_temp.last_file_index
      @help_window.set_text(Vocab::SaveMessage)
    else
      @index = self.latest_file_index
      @help_window.set_text(Vocab::LoadMessage)
    end
    @savefile_windows[@index].selected = true
    @page_file_max = ((416 - @help_window.height) / 90).truncate
    for i in 0...@file_max
      window = @savefile_windows[i]
      if @index > @page_file_max - 1
        if @index < @file_max - @page_file_max - 1
          @top_row = @index
          window.y -= @index * window.height
        elsif @index >= @file_max - @page_file_max
          @top_row = @file_max - @page_file_max
          window.y -= (@file_max - @page_file_max) * window.height
        else
          @top_row = @index
          window.y -= @index * window.height
        end
      end
      window.visible = (window.y >= @help_window.height and
      window.y < @help_window.height + @page_file_max * window.height)
    end
  end
 
  #create window slots
  def create_savefile_windows
    @top_row = 0
    @savefile_windows = []
    for i in 0..(NUMBER_OF_SAVE_SLOTS - 1)
      @savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
    end
    @item_max = NUMBER_OF_SAVE_SLOTS
  end
 
  #handle going down
  def cursor_down(wrap)
    @file_max = NUMBER_OF_SAVE_SLOTS
    if @index < @file_max - 1 or wrap
      @index = (@index + 1) % @file_max
      for i in 0...@file_max
        window = @savefile_windows[i]
        if @index == 0
          @top_row = 0
          window.y = @help_window.height + i % @file_max * window.height
        elsif @index - @top_row > @page_file_max - 1
          window.y -= window.height
        end
        window.visible = (window.y >= @help_window.height and
          window.y < @help_window.height + @page_file_max * window.height)
      end
      if @index - @top_row > @page_file_max - 1
        @top_row += 1
      end
    end
  end
  #handle going up
  def cursor_up(wrap)
    @file_max = NUMBER_OF_SAVE_SLOTS
    if @index > 0 or wrap
      @index = (@index - 1 + @file_max) % @file_max
      for i in 0...@file_max
        window = @savefile_windows[i]
        if @index == @file_max - 1
          @top_row = @file_max - @page_file_max
          window.y = @help_window.height + i % @file_max * window.height
          window.y -= (@file_max - @page_file_max) * window.height
        elsif @index - @top_row < 0
          window.y += window.height
        end
        window.visible = (window.y >= @help_window.height and
          window.y < @help_window.height + @page_file_max * window.height)
      end
      if @index - @top_row < 0
        @top_row -= 1
      end
    end
  end
 
 
  alias auto_save_bulletxt_determine_savefile determine_savefile
  def determine_savefile
    #if true, player has selected autosave slot so he must not save
    if @savefile_windows[@index].filename == SAVING_FILE
      saving_not_allowed if @saving
      return  if @saving
    end
    #if here player can save
    @saving_inside_menu = true if @saving
    auto_save_bulletxt_determine_savefile
  end
 
  #window warning player can't save on auto save slot
  def saving_not_allowed
    Sound.play_buzzer
    b = Bitmap.new(340,60) 
    b.draw_text(0, 20,340, 20, "You can't save on the Auto Save slot.") 
    w = Window_Message.new
    w.contents = b
    w.width = 380
    w.height = 100
    w.visible = true
    w.openness = 255
    w.x = 100
    w.y = 180
    w.back_opacity = 255
    w.opacity = 255
    w.update
    Graphics.wait(180)
    b.dispose
    w.dispose
    w = nil
    b = nil
  end  
 
 
  def do_save
    #if true, player is saving from inside menu
    if @saving_inside_menu
      file = File.open(@savefile_windows[@index].filename, "wb")
    else
      #if here player has done a manual Auto_Save.new call from event
      file = File.open(SAVING_FILE, "wb")
    end
    write_save_data(file)
    file.close
    return_scene if @saving_inside_menu
    #$scene = Scene_Map.new if @saving_inside_menu == false
    @saving_inside_menu = false
  end
 
end
 
 
 
class Scene_Battle < Scene_Base
  #save after winning a battle
  alias auto_save_bulletxt_process_victory process_victory
  def process_victory
    auto_save_bulletxt_process_victory
    Auto_Save.new if $BTEST == false && $game_switches[SAVE_AFTER_WINNING_BATTLE] == false
  end
end
 
 
 
class Scene_Map < Scene_Base
  #save on map transfer
  alias auto_save_bulletxt_update_transfer_player  update_transfer_player
  def update_transfer_player
    return unless $game_player.transfer?
    auto_save_bulletxt_update_transfer_player
    Auto_Save.new if $game_switches[SAVE_ON_MAP_TRANSFER] == false
  end
end
 
 
 
class Scene_Menu < Scene_Base
  #save when exiting menu
  alias auto_save_bulletxt_update_command_selection update_command_selection
  def update_command_selection    
    if Input.trigger?(Input::B)
      Auto_Save.new if $game_switches[SAVE_AFTER_CLOSING_MENU] == false
    end
    auto_save_bulletxt_update_command_selection
  end
end
 
 
class Window_SaveFile < Window_Base
 
  def initialize(file_index, filename)
    super(0, 56 + file_index % NUMBER_OF_SAVE_SLOTS * 90, 544, 90)
    @file_index = file_index
    @filename = filename
    load_gamedata
    refresh
    @selected = false
  end
 
  #change autoslave slot string "File $n"
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    name = Vocab::File + " #{@file_index + 1}"  if @file_index != SAVE_NUMBER - 1 
    self.contents.draw_text(4, 0, 200, WLH, name)
    @name_width = contents.text_size(name).width
    @autosaveslot = "Auto Save Slot"
    self.contents.draw_text(6, 0, 200, WLH, @autosaveslot) if @file_index == SAVE_NUMBER - 1
    if @file_exist
      draw_party_characters(152, 58)
      draw_playtime(0, 34, contents.width - 4, 2)
    end
  end
 
  #handle cursor width when going on autosave slot
 def update_cursor
    if @selected
      self.cursor_rect.set(0, 0, @name_width + 8, WLH)  if @file_index != SAVE_NUMBER - 1 
      self.cursor_rect.set(0, 0, 140, WLH)  if @file_index == SAVE_NUMBER - 1 
    else
      self.cursor_rect.empty
    end
  end
 
end

highlight to read

Spoiler: NeoSaveSystemVI

Ruby Source code

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
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
#==========================================================================
# ● [VX] ◦ Neo Save System VI ◦ □
#---------------------------------------------------------------------------
# ◦ Author: Woratana [woratana@hotmail.com]
# ◦ Thaiware RPG Maker Community
# ◦ Last Updated:
# ◦ Version: III -> VI (By Helladen) 
# ◦ Screenshot image credit Andreas21, and Cybersam
# ◦ Commerical usage ask Wortana.
#---------------------------------------------------------------------------
# ◦ Log VI:
# - Cleaned up comments and code format.
# - Added corresponding map variables system to MAP_NO_NAME.
# - Added where you can use premade images that use a map's name.
#---------------------------------------------------------------------------
# ◦ Log V:
# - Screenshot support for those who want tone/weather/sprites.
# - Added an option to stay in save screen after you save the game.
#---------------------------------------------------------------------------
# ◦ Log IV:
# - New addition for hiding map names. You can control the switch to
#   allow MAP_NO_NAME_LIST to work or not.
# - Revised some of the settings and script organization.
# - Added an option to disable the vocab::Gold text right of the number.
# - Added an option to use default opacity or not.
# - Swap tile compatibility support.
#---------------------------------------------------------------------------
# ◦ Log III:
# - Changed back to draw tile map for save image, don't need any image.
# - For drawing tile map, the characters won't show on the tile map.
#---------------------------------------------------------------------------
# ◦ Log II:
# - Screenshot DLL is not work with Vista Aero, so I remove it
#   and use image for each map instead of screenshot.
# - Actor's level in last version (V.1) is incorrect.
#---------------------------------------------------------------------------
# ◦ Features:
# - Unlimited save slots, you can choose max save slot
# - Many configuration options
# - Swap tile support
# - You can use image for scene's background
# - Choose your save file's name, and folder to store save files
# - Choose to show only information you want
# - Editable text for information's title
# - Draw tile map for map that player is currently on.
# - Remove text you don't want from map's name (e.g. tags for special script)
# - Choose map that you don't want to show the name on
# - Include save confirmation window before overwrite old save
#===========================================================================
 
module Wora_NSS Wora_NSS
  #==========================================================================
  # * START NEO SAVE SYSTEM - SETUP
  #--------------------------------------------------------------------------
  OPACITY_DEFAULT = true # This will use the default opacity for windows.
  # Please note that this will affect both opacitys below.
 
  NSS_WINDOW_OPACITY = 255 # All windows' opacity (Lowest 0 - 255 Highest).
 
  # You can change this to 0 in case you want to use image for background.
  NSS_IMAGE_BG = '' # Background image file name, it must be in folder picture
  #                   use '' for no background.
  NSS_IMAGE_BG_OPACITY = 255 # Opacity for background image.
 
  # If you use the screenshot method this does not matter.
  SWAP_TILE = true # Make this false if you don't use the swap_tile script
  SWAP_TILE_SWITCH = 84 # The switch needs to be the same as your swap tile
  #                       switch, but if SWAP_TILE is false it does not matter.
 
  # If this is true it will screenshot the map, if false it will draw it.
  SCREENSHOT_IMAGE = true # Drawing the map is good because it doesn't require
  # a .DLL or images for the screenshot, and it will have tone and
  # weather. If you are using SwapXT and this value is false you need to turn
  # on swap tile.
 
  # Do you want to use your own custom images for each map via map name.
  PREMADE_IMAGE = false # If this is true it sets its priority over
  #                       screenshots/etc.
 
  # Image type for screenshot '.bmp', or '.jpg', or '.png'.
  IMAGE_FILETYPE = '.png'
 
  # If this is true then the scene will not change when you save the game. 
  SCENE_CHANGE = true # Changes scene to map instead of remaining in Save screen.
 
  MAX_SAVE_SLOT = 20 # Max save slots.
  SLOT_NAME = 'SLOT {id}'
 
  # Name of the slot (show in save slots list), use {id} for slot ID.
  SAVE_FILE_NAME = 'Save {id}.rvdata'
  # Save file name, you can also change its file type from .rvdata to other.
 
  # Use {id} for save slot ID.
  SAVE_PATH = '' # Path to store save file, e.g. 'Save/' or '' (for game folder).
  SAVED_SLOT_ICON = 133 # Icon Index for saved slot.
 
  EMPTY_SLOT_ICON = 141 # Icon Index for empty slot.
  EMPTY_SLOT_TEXT = 'Empty' # Text to show for empty slot's data.
 
  DRAW_GOLD = true # Draw Gold.
  DRAW_PLAYTIME = true # Draw playtime.
  DRAW_LOCATION = true # Draw location.
  DRAW_FACE = true # Draw actor's face.
  DRAW_LEVEL = true # Draw actor's level.
  DRAW_NAME = true # Draw actor's name.
  DRAW_TEXT_GOLD = false # Draw the vocab::Gold text to the right of the number.
 
  PLAYTIME_TEXT = 'Play Time: '
  GOLD_TEXT = 'Gold: '
  LOCATION_TEXT = 'Location: '
  LV_TEXT = 'Lv. '
 
  MAP_NAME_TEXT_SUB = %w{}
  # Text that you want to remove from map name,
  # e.g. %w{[LN] [DA]} will remove text '[LN]' and '[DA]' from map name.
 
  # Do we want to use corresponding variables for each map number in MAP_NO_NAME_LIST?
  MAP_NO_NAME_VARIABLE = true # You just apply the value one to the variable which
                              # is the map number to change it from MAP_NO_NAME.
 
  MAP_NO_NAME_LIST = [2] # ID of Map that will not show map name, e.g. [1,2,3].
  MAP_NO_NAME = '???' # What you will use to call the map in the no name list.
 
  # This is a switch that can activate or deactivate maps from being displayed as
  # MAP_NO_NAME. If it is off then maps will return back to normal.
  MAP_NO_NAME_SWITCH = 95 # This switch has to be on for MAP_NO_NAME_LIST to work.
 
  MAP_BORDER = Color.new(0,0,0,200) # Map image border color (R,G,B,Opacity).
  FACE_BORDER = Color.new(0,0,0,200) # Face border color.
 
  # Save confirmation window
  SFC_Text_Confirm = 'Confirm to save' # Text to confirm to save file.
  SFC_Text_Cancel = 'Cancel' # Text to cancel to save.
  SFC_Window_Width = 200 # Width of Confirmation Window.
  SFC_Window_X_Offset = 0 # Move Confirmation Window horizontally.
  SFC_Window_Y_Offset = 0 # Move Confirmation Window vertically.
 
  #-------------------------------------------------------------------------
  # END NEO SAVE SYSTEM - SETUP (Edit below at your own risk)
  #=========================================================================
 
  #-------------------------------------------------------------
  # Screenshot V2 by Andreas21 and Cybersam
  #-------------------------------------------------------------
  @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), ''
  @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
  @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' 
  module_function
 
  def self.shot(file_name)
    case IMAGE_FILETYPE
      when '.bmp'; typid = 0
      when '.jpg'; typid = 1
      when '.png'; typid = 2
    end
 
    # Get Screenshot
    filename = file_name + IMAGE_FILETYPE
    @screen.call(0, 0, Graphics.width, Graphics.height, filename, self.handel,
    typid)
  end
 
  def self.handel
    game_name = "\0" * 256
    @readini.call('Game','Title','',game_name,255,".\\Game.ini")
    game_name.delete!("\0")
 
    return @findwindow.call('RGSS Player',game_name)
  end
end
 
class Scene_File < Scene_Base
  include Wora_NSS
  attr_reader :window_slotdetail
 
  #-------------------------------------------------------------------------
  # * Start processing
  #-------------------------------------------------------------------------
  def start
    super
 
    create_menu_background
 
    if NSS_IMAGE_BG != ''
      @bg = Sprite.new
      @bg.bitmap = Cache.picture(NSS_IMAGE_BG)
      @bg.opacity = NSS_IMAGE_BG_OPACITY
    end
 
    @help_window = Window_Help.new
    command = []
 
    (1..MAX_SAVE_SLOT).each do |i|
      command << SLOT_NAME.clone.gsub!(/\{ID\}/i) { i.to_s }
    end
 
    @window_slotdetail = Window_NSS_SlotDetail.new
    @window_slotlist = Window_SlotList.new(160, command)
    @window_slotlist.y = @help_window.height
    @window_slotlist.height = Graphics.height - @help_window.height
 
    if !OPACITY_DEFAULT
      @help_window.opacity = NSS_WINDOW_OPACITY
      @window_slotdetail.opacity = @window_slotlist.opacity = NSS_WINDOW_OPACITY
    end
 
    # Create folder for save file
    if SAVE_PATH != ''
      Dir.mkdir(SAVE_PATH) if !FileTest.directory?(SAVE_PATH)
    end
 
    if @saving
      @index = $game_temp.last_file_index
      @help_window.set_text(Vocab::SaveMessage)
    else
      @index = self.latest_file_index
      @help_window.set_text(Vocab::LoadMessage)
 
      (1..MAX_SAVE_SLOT).each do |i|
        @window_slotlist.draw_item(i-1, false) if !@window_slotdetail.file_exist?(i)
      end
    end
 
    @window_slotlist.index = @index
 
    # Draw information
    @last_slot_index = @window_slotlist.index
    @window_slotdetail.draw_data(@last_slot_index + 1)
  end
 
  #--------------------------------------------------------------------------  
  # * Termination Processing
  #--------------------------------------------------------------------------
  def terminate
    super
 
    dispose_menu_background
 
    unless @bg.nil?
      @bg.bitmap.dispose
      @bg.dispose
    end
 
    @window_slotlist.dispose
    @window_slotdetail.dispose
    @help_window.dispose
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
 
    if !@confirm_window.nil?
      @confirm_window.update
 
      if Input.trigger?(Input::C)
        if @confirm_window.index == 0
          determine_savefile
          @confirm_window.dispose
          @confirm_window = nil
        else
          Sound.play_cancel
          @confirm_window.dispose
          @confirm_window = nil
        end
      elsif Input.trigger?(Input::B)
        Sound.play_cancel
        @confirm_window.dispose
        @confirm_window = nil
      end
    else
      update_menu_background
      @window_slotlist.update
 
      if @window_slotlist.index != @last_slot_index
        @last_slot_index = @window_slotlist.index
        @window_slotdetail.draw_data(@last_slot_index + 1)
      end
 
      @help_window.update
      update_savefile_selection
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Save File Selection
  #--------------------------------------------------------------------------
  def update_savefile_selection
    if Input.trigger?(Input::C)
      if @saving and @window_slotdetail.file_exist?(@last_slot_index + 1)
        Sound.play_decision
        text1 = SFC_Text_Confirm
        text2 = SFC_Text_Cancel
        @confirm_window = Window_Command.new(SFC_Window_Width,[text1,text2])
        @confirm_window.x = ((544 - @confirm_window.width) / 2) + SFC_Window_X_Offset
        @confirm_window.y = ((416 - @confirm_window.height) / 2) + SFC_Window_Y_Offset
      else
        determine_savefile
      end
    elsif Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    end
  end
 
  #--------------------------------------------------------------------------
  # * Execute Save
  #--------------------------------------------------------------------------
  def do_save
    if SCREENSHOT_IMAGE
      File.rename(SAVE_PATH + 'temp' + IMAGE_FILETYPE,
      make_filename(@last_slot_index).gsub(/\..*$/){ '_ss' } + IMAGE_FILETYPE)  
    end  
 
    file = File.open(make_filename(@last_slot_index), "wb")
    write_save_data(file)
    file.close   
 
    # Alter the scene after the saving is done
    if SCENE_CHANGE
      $scene = Scene_Map.new
    else
      $scene = Scene_File.new(true, false, false)
    end
  end
 
  #--------------------------------------------------------------------------
  # * Execute Load
  #--------------------------------------------------------------------------
  def do_load
    file = File.open(make_filename(@last_slot_index), "rb")
    read_save_data(file)
    file.close
    $scene = Scene_Map.new
    RPG::BGM.fade(1500)
    Graphics.fadeout(60)
    Graphics.wait(40)
    @last_bgm.play
    @last_bgs.play
  end
 
  #--------------------------------------------------------------------------
  # * Confirm Save File
  #--------------------------------------------------------------------------
  def determine_savefile
    if @saving
      Sound.play_save
      do_save
    else
      if @window_slotdetail.file_exist?(@last_slot_index + 1)
        Sound.play_load
        do_load
      else
        Sound.play_buzzer
        return
      end
    end
 
    $game_temp.last_file_index = @last_slot_index
  end
 
  #--------------------------------------------------------------------------
  # * Create Filename
  #     file_index : save file index (0-3)
  #--------------------------------------------------------------------------
  def make_filename(file_index)
    return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index + 1).to_s }
  end
 
  #--------------------------------------------------------------------------
  # * Select File With Newest Timestamp
  #--------------------------------------------------------------------------
  def latest_file_index
    latest_index = 0
    latest_time = Time.at(0)
 
    (1..MAX_SAVE_SLOT).each do |i|
      file_name = make_filename(i - 1)
      next if !@window_slotdetail.file_exist?(i)
      file_time = File.mtime(file_name)
 
      if file_time > latest_time
        latest_time = file_time
        latest_index = i - 1
      end
    end
 
    return latest_index
  end
 
class Window_SlotList < Window_Command
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index, enabled = true)
    rect = item_rect(index)
    rect.x += 4
    rect.width -= 8
    icon_index = 0
    self.contents.clear_rect(rect)
 
    if $scene.window_slotdetail.file_exist?(index + 1)
      icon_index = Wora_NSS::SAVED_SLOT_ICON
    else
      icon_index = Wora_NSS::EMPTY_SLOT_ICON
    end
 
    if !icon_index.nil?
      rect.x -= 4
      draw_icon(icon_index, rect.x, rect.y, enabled) # Draw Icon
      rect.x += 26
      rect.width -= 20
    end
 
    self.contents.clear_rect(rect)
    self.contents.font.color = normal_color
    self.contents.font.color.alpha = enabled ? 255 : 128
    self.contents.draw_text(rect, @commands[index])
  end
 
  def cursor_down(wrap = false)
    if @index < @item_max - 1 or wrap
      @index = (@index + 1) % @item_max
    end
  end
 
  def cursor_up(wrap = false)
    if @index > 0 or wrap
      @index = (@index - 1 + @item_max) % @item_max
    end
  end
end
 
class Window_NSS_SlotDetail < Window_Base
  include Wora_NSS
 
  def initialize
    super(160, 56, 384, 360)
 
    @data = []
    @exist_list = []
    @bitmap_list = {}
    @map_name = []
  end
 
  def dispose
    dispose_tilemap
    super
  end
 
  def draw_data(slot_id)
    contents.clear # 352, 328
    dispose_tilemap
 
    load_save_data(slot_id) if @data[slot_id].nil?
      if @exist_list[slot_id]
        save_data = @data[slot_id]
        contents.fill_rect(0,30,352,152, MAP_BORDER)
 
        if PREMADE_IMAGE
          bitmap = get_bitmap("Graphics/Save/" + @data[slot_id]['map_name'] + IMAGE_FILETYPE)
          rect = Rect.new((Graphics.width-348)/2,(Graphics.height-156)/2,348,156)
          contents.blt(2,32,bitmap,rect)
        elsif SCREENSHOT_IMAGE and save_data['ss']
          bitmap = get_bitmap(save_data['ss_path'])
          rect = Rect.new((Graphics.width-348)/2,(Graphics.height-156)/2,348,156)
          contents.blt(2,32,bitmap,rect)
        elsif SWAP_TILE and $game_switches[SWAP_TILE_SWITCH]
          create_swaptilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
        else
          create_tilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
        end
 
        if DRAW_GOLD
          gold_textsize = contents.text_size(save_data['gamepar'].gold).width
          goldt_textsize = contents.text_size(GOLD_TEXT).width  
          contents.font.color = system_color
          contents.draw_text(0, 0, goldt_textsize, WLH, GOLD_TEXT)
          contents.font.color = normal_color
          contents.draw_text(goldt_textsize, 0, gold_textsize, WLH, save_data['gamepar'].gold)  
 
          if DRAW_TEXT_GOLD
            contents.draw_text(goldt_textsize + gold_textsize, 0, 200, WLH, Vocab::gold)
 
          else
            gold_textsize = 0
            goldt_textsize = 0                
          end
        end
 
        if DRAW_PLAYTIME
          hour = save_data['total_sec'] / 60 / 60
          min = save_data['total_sec'] / 60 % 60
          sec = save_data['total_sec'] % 60
          time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
          pt_textsize = contents.text_size(PLAYTIME_TEXT).width
          ts_textsize = contents.text_size(time_string).width
          contents.font.color = system_color
          contents.draw_text(contents.width - ts_textsize - pt_textsize, 0,
          pt_textsize, WLH, PLAYTIME_TEXT)
          contents.draw_text(goldt_textsize + gold_textsize,0,200,WLH, Vocab::gold)
          contents.font.color = normal_color
          contents.draw_text(0, 0, contents.width, WLH, time_string, 2)
        end
 
        if DRAW_LOCATION
          lc_textsize = contents.text_size(LOCATION_TEXT).width
          mn_textsize = contents.text_size(save_data['map_name']).width
          contents.font.color = system_color
          contents.draw_text(0, 190, contents.width, WLH, LOCATION_TEXT)
          contents.font.color = normal_color
          contents.draw_text(lc_textsize, 190, contents.width, WLH, save_data['map_name'])
        end
 
        # Draw level & name
        save_data['gamepar'].members.each_index do |i|
          actor = save_data['gameactor'][save_data['gamepar'].members[i].id]
          face_x_base = (i*80) + (i*8)
          face_y_base = 216
          lvn_y_plus = 10
          lv_textsize = contents.text_size(actor.level).width
          lvt_textsize = contents.text_size(LV_TEXT).width
 
        if DRAW_FACE
          contents.fill_rect(face_x_base, face_y_base, 84, 84, FACE_BORDER)
          draw_face(actor.face_name, actor.face_index, face_x_base + 2,
          face_y_base + 2, 80)
        end
 
        if DRAW_LEVEL
          contents.font.color = system_color
          contents.draw_text(face_x_base + 2 + 80 - lv_textsize - lvt_textsize,
          face_y_base + 2 + 80 - WLH + lvn_y_plus, lvt_textsize, WLH, LV_TEXT)
          contents.font.color = normal_color
          contents.draw_text(face_x_base + 2 + 80 - lv_textsize,
          face_y_base + 2 + 80 - WLH + lvn_y_plus, lv_textsize, WLH, actor.level)
        end
 
        if DRAW_NAME
          contents.draw_text(face_x_base, face_y_base + 2 + 80 + lvn_y_plus - 6, 84,
          WLH, actor.name, 1)
        end
      end
    else
      contents.draw_text(0,0, contents.width, contents.height - WLH, EMPTY_SLOT_TEXT, 1)
    end
  end
 
  def load_save_data(slot_id)
    file_name = make_filename(slot_id)
 
    if file_exist?(slot_id) or FileTest.exist?(file_name)
      @exist_list[slot_id] = true
      @data[slot_id] = {}
 
      # Start load data
      file = File.open(file_name, "r")
      @data[slot_id]['time'] = file.mtime
      @data[slot_id]['char'] = Marshal.load(file)
      @data[slot_id]['frame'] = Marshal.load(file)
      @data[slot_id]['last_bgm'] = Marshal.load(file)
      @data[slot_id]['last_bgs'] = Marshal.load(file)
      @data[slot_id]['gamesys'] = Marshal.load(file)
      @data[slot_id]['gamemes'] = Marshal.load(file)
      @data[slot_id]['gameswi'] = Marshal.load(file)
      @data[slot_id]['gamevar'] = Marshal.load(file)
      @data[slot_id]['gameselfvar'] = Marshal.load(file)
      @data[slot_id]['gameactor'] = Marshal.load(file)
      @data[slot_id]['gamepar'] = Marshal.load(file)
      @data[slot_id]['gametro'] = Marshal.load(file)
      @data[slot_id]['gamemap'] = Marshal.load(file)
      @data[slot_id]['total_sec'] = @data[slot_id]['frame'] / Graphics.frame_rate
 
      # Save the image
      if SCREENSHOT_IMAGE
        @data[slot_id]['ss_path'] = file_name.gsub(/\..*$/){'_ss'} + IMAGE_FILETYPE
        @data[slot_id]['ss'] = FileTest.exist?(@data[slot_id]['ss_path'])
      end
 
      @data[slot_id]['map_name'] = get_mapname(@data[slot_id]['gamemap'].map_id)
      file.close
    else
      @exist_list[slot_id] = false
      @data[slot_id] = -1
    end
  end
 
  def make_filename(file_index)
    return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index).to_s }
  end
 
  def file_exist?(slot_id)
    return @exist_list[slot_id] if !@exist_list[slot_id].nil?
 
    @exist_list[slot_id] = FileTest.exist?(make_filename(slot_id))
 
    return @exist_list[slot_id]
  end
 
  def get_bitmap(path)
    if !@bitmap_list.include?(path)
      @bitmap_list[path] = Bitmap.new(path)
    end
 
    return @bitmap_list[path]
  end
 
  def get_mapname(map_id)
    if @map_data.nil?
      @map_data = load_data("Data/MapInfos.rvdata")
    end
 
    if @map_name[map_id].nil?
      if MAP_NO_NAME_LIST.include?(map_id) and $game_switches[MAP_NO_NAME_SWITCH]
        if $game_variables[map_id] == 0 or !MAP_NO_NAME_VARIABLE
          @map_name[map_id] = MAP_NO_NAME
        else
          @map_name[map_id] = @map_data[map_id].name
        end  
      else
        @map_name[map_id] = @map_data[map_id].name
      end
 
      MAP_NAME_TEXT_SUB.each_index do |i|
        @map_name[map_id].sub!(MAP_NAME_TEXT_SUB[i], '')
        @mapname = @map_name[map_id]
      end 
    end
 
    return @map_name[map_id] 
  end   
 
  def create_tilemap(map_data, ox, oy)
    @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
    @viewport.z = self.z
    @tilemap = Tilemap.new(@viewport)
    @tilemap.bitmaps[0] = Cache.system("TileA1")
    @tilemap.bitmaps[1] = Cache.system("TileA2")
    @tilemap.bitmaps[2] = Cache.system("TileA3")
    @tilemap.bitmaps[3] = Cache.system("TileA4")
    @tilemap.bitmaps[4] = Cache.system("TileA5")
    @tilemap.bitmaps[5] = Cache.system("TileB")
    @tilemap.bitmaps[6] = Cache.system("TileC")
    @tilemap.bitmaps[7] = Cache.system("TileD")
    @tilemap.bitmaps[8] = Cache.system("TileE")
    @tilemap.map_data = map_data
    @tilemap.ox = ox / 8 + 99
    @tilemap.oy = oy / 8 + 90
  end
 
  def create_swaptilemap(map_data, ox, oy)
    @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
    @viewport.z = self.z
    @tilemap = Tilemap.new(@viewport)
 
    tile1 = Cache_Swap_Tiles.swap($tileA1 + ".png") rescue nil
    tile2 = Cache_Swap_Tiles.swap($tileA2 + ".png") rescue nil
    tile3 = Cache_Swap_Tiles.swap($tileA3 + ".png") rescue nil
    tile4 = Cache_Swap_Tiles.swap($tileA4 + ".png") rescue nil
    tile5 = Cache_Swap_Tiles.swap($tileA5 + ".png") rescue nil
    tile6 = Cache_Swap_Tiles.swap($tileB + ".png") rescue nil
    tile7 = Cache_Swap_Tiles.swap($tileC + ".png") rescue nil
    tile8 = Cache_Swap_Tiles.swap($tileD + ".png") rescue nil
    tile9 = Cache_Swap_Tiles.swap($tileE + ".png") rescue nil
 
    if $tileA1 != nil
      @tilemap.bitmaps[0] = tile1
    else
      @tilemap.bitmaps[0] = Cache.system("TileA1")
    end
 
    if $tileA2 != nil
      @tilemap.bitmaps[1] = tile2
    else
      @tilemap.bitmaps[1] = Cache.system("TileA2")
    end
 
    if $tileA3 != nil
      @tilemap.bitmaps[2] = tile3  
    else
      @tilemap.bitmaps[2] = Cache.system("TileA3")
    end  
 
    if $tileA4 != nil
      @tilemap.bitmaps[3] = tile4
    else
      @tilemap.bitmaps[3] = Cache.system("TileA4")
    end
 
    if $tileA5 != nil
      @tilemap.bitmaps[4] = tile5  
    else
      @tilemap.bitmaps[4] = Cache.system("TileA5")
    end
 
    if $tileB != nil
      @tilemap.bitmaps[5] = tile6
    else
      @tilemap.bitmaps[5] = Cache.system("TileB")  
    end  
 
    if $tileC != nil
      @tilemap.bitmaps[6] = tile7
    else
      @tilemap.bitmaps[6] = Cache.system("TileC")
    end  
 
    if $tileD != nil
      @tilemap.bitmaps[7] = tile8
    else
      @tilemap.bitmaps[7] = Cache.system("TileD")  
    end
 
    if $tileE != nil
      @tilemap.bitmaps[8] = tile9
    else
      @tilemap.bitmaps[8] = Cache.system("TileE")  
    end
 
    @tilemap.map_data = map_data
    @tilemap.ox = ox / 8 + 99
    @tilemap.oy = oy / 8 + 90
  end
 
  def dispose_tilemap
    unless @tilemap.nil?
      @tilemap.dispose
      @tilemap = nil
      end
    end
  end
end
 
class Scene_Title < Scene_Base
  def check_continue
    file_name = Wora_NSS::SAVE_PATH + Wora_NSS::SAVE_FILE_NAME.gsub(/\{ID\}/i) { '*' }
    @continue_enabled = (Dir.glob(file_name).size > 0)
  end
end
 
class Scene_Map < Scene_Base
  alias wora_nss_scemap_ter terminate
 
  def terminate
    Wora_NSS.shot(Wora_NSS::SAVE_PATH + 'temp')
    wora_nss_scemap_ter
  end
end
#======================================================================
# END - NEO SAVE SYSTEM by Woratana and Helladen
#======================================================================

highlight to read

Spoiler: AutoSave VX + Woratana Neo Save System 3.0

Ruby Source code

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
=begin
                      AutoSave VX + Woratana Neo Save System 3.0
 
Author: BulleXt(bulletxt@gmail.com)
Version: 0.1
Date: 06/07/2009
 
Description:
This script by default will automatically save when you do a map transfer,
after winning a battle and after exiting menu.
You can also manually call an autosave inside an event by simply doing a
call script like this:
Auto_Save.new
The script doesn't disable normal saving system so player can still save on his
slots, he will not be able to overwrite the autosave slot.
The script also lets you set how many saving slots you want.
=end
 
 
#This is the autosave slot number
SAVE_NUMBER = 1
 
#This is an ID switch, if ON it disables the autosave on map transfer
SAVE_ON_MAP_TRANSFER = 1
 
#This is an ID switch, if ON it disables the autosave after winning a battle
SAVE_AFTER_WINNING_BATTLE = 2
 
#This is an ID switch, if ON it disables the autosave after closing Menu
SAVE_AFTER_CLOSING_MENU = 3
 
 
 
#===============================================================
# ? [VX] ? Neo Save System III ? ?
#--------------------------------------------------------------
# ? by Woratana [woratana@hotmail.com]
# ? Thaiware RPG Maker Community
# ? Released on: 15/02/2009
# ? Version: 3.0
#--------------------------------------------------------------
# ? Log III:
# - Change back to draw tilemap as screenshot. Don't need any image.
# - For drawing tilemap, the characters won't show on the tilemap.
#--------------------------------------------------------------
# ? Log II:
# - Screenshot DLL is not work with Vista Aero, so I remove it
# and use image for each map instead of screenshot.
# - Actor's level in last version (V.1) is incorrect.
#--------------------------------------------------------------
# ? Features:
# - Unlimited save slots, you can choose max save slot
# - You can use image for scene's background
# - Choose your save file's name, and folder to store save files
# - Choose to show only information you want
# - Editable text for information's title
# - Draw tilemap for map that player is currently in.
# - Remove text you don't want from map's name (e.g. tags for special script)
# - Choose map that you don't want to show its name
# - Include save confirmation window before overwrite old save
#=================================================================
 
module Wora_NSS
  #==========================================================================
  # * START NEO SAVE SYSTEM - SETUP
  #--------------------------------------------------------------------------
  NSS_WINDOW_OPACITY = 255 # All windows' opacity (Lowest 0 - 255 Highest)
  # You can change this to 0 in case you want to use image for background
  NSS_IMAGE_BG = '' # Background image file name, it must be in folder Picture.
  # use '' for no background
  NSS_IMAGE_BG_OPACITY = 255 # Opacity for background image
 
  MAX_SAVE_SLOT = 20 # Max save slots no.
  SLOT_NAME = 'SLOT {id}'
  # Name of the slot (show in save slots list), use {id} for slot ID
  SAVE_FILE_NAME = 'Saveslot{id}.rvdata'
  # Save file name, you can also change its file type from .rvdata to other
  # use {id} for save slot ID
  SAVE_PATH = '' # Path to store save file, e.g. 'Save/' or '' (for game folder)
 
  SAVED_SLOT_ICON = 133 # Icon Index for saved slot
  EMPTY_SLOT_ICON = 141 # Icon Index for empty slot
 
  EMPTY_SLOT_TEXT = '-NO DATA-' # Text to show for empty slot's data
 
  DRAW_GOLD = true # Draw Gold
  DRAW_PLAYTIME = true # Draw Playtime
  DRAW_LOCATION = true # Draw location
  DRAW_FACE = true # Draw Actor's face
  DRAW_LEVEL = true # Draw Actor's level
  DRAW_NAME = true # Draw Actor's name
 
  PLAYTIME_TEXT = 'Play Time: '
  GOLD_TEXT = 'Gold: '
  LOCATION_TEXT = 'Location: '
  LV_TEXT = 'Lv '
 
  MAP_NAME_TEXT_SUB = %w{}
  # Text that you want to remove from map name,
  # e.g. %w{[LN] [DA]} will remove text '[LN]' and '[DA]' from map name
  MAP_NO_NAME_LIST = [] # ID of Map that will not show map name, e.g. [1,2,3]
  MAP_NO_NAME_NAME = '??????????' # What you will use to call map in no name list
 
  MAP_BORDER = Color.new(0,0,0,200) # Map image border color (R,G,B,Opacity)
  FACE_BORDER = Color.new(0,0,0,200) # Face border color
 
  ## SAVE CONFIRMATION WINDOW ##
  SFC_Text_Confirm = 'Confirm to save' # Text to confirm to save file
  SFC_Text_Cancel = 'Cancel' # Text to cancel to save
  SFC_Window_Width = 200 # Width of Confirmation Window
  SFC_Window_X_Offset = 0 # Move Confirmation Window horizontally
  SFC_Window_Y_Offset = 0 # Move Confirmation Window vertically
  #----------------------------------------------------------------------
  # END NEO SAVE SYSTEM - SETUP
  #=========================================================================
end
 
class Auto_Save < Scene_File
  def initialize
    do_save
  end
end
 
 
 
class Scene_File < Scene_Base
  include Wora_NSS
  attr_reader :window_slotdetail
  #--------------------------------------------------------------------------
  # * Start processing
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    if NSS_IMAGE_BG != ''
      @bg = Sprite.new
      @bg.bitmap = Cache.picture(NSS_IMAGE_BG)
      @bg.opacity = NSS_IMAGE_BG_OPACITY
    end
    @help_window = Window_Help.new
    command = []
    (1..MAX_SAVE_SLOT).each do |i|
      command << SLOT_NAME.clone.gsub!(/\{ID\}/i) { i.to_s }
    end
    @window_slotdetail = Window_NSS_SlotDetail.new
    @window_slotlist = Window_SlotList.new(160, command)
    @window_slotlist.y = @help_window.height
    @window_slotlist.height = Graphics.height - @help_window.height
    @help_window.opacity = NSS_WINDOW_OPACITY
    @window_slotdetail.opacity = @window_slotlist.opacity = NSS_WINDOW_OPACITY
 
  # Create Folder for Save file
  if SAVE_PATH != ''
    Dir.mkdir(SAVE_PATH) if !FileTest.directory?(SAVE_PATH)
  end
    if @saving
      @index = $game_temp.last_file_index
      @help_window.set_text(Vocab::SaveMessage)
    else
      @index = self.latest_file_index
      @help_window.set_text(Vocab::LoadMessage)
      (1..MAX_SAVE_SLOT).each do |i|
        @window_slotlist.draw_item(i-1, false) if !@window_slotdetail.file_exist?(i)
      end
    end
    @window_slotlist.index = @index
    # Draw Information
    @last_slot_index = @window_slotlist.index
    @window_slotdetail.draw_data(@last_slot_index + 1)
  end
  #--------------------------------------------------------------------------
  # * Termination Processing
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_menu_background
    unless @bg.nil?
      @bg.bitmap.dispose
      @bg.dispose
    end
    @window_slotlist.dispose
    @window_slotdetail.dispose
    @help_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    if !@confirm_window.nil?
      @confirm_window.update
      if Input.trigger?(Input::C)
        if @confirm_window.index == 0
          determine_savefile
          @confirm_window.dispose
          @confirm_window = nil
        else
          Sound.play_cancel
          @confirm_window.dispose
          @confirm_window = nil
        end
      elsif Input.trigger?(Input::B)
      Sound.play_cancel
      @confirm_window.dispose
      @confirm_window = nil
      end
    else
      update_menu_background
      @window_slotlist.update
      if @window_slotlist.index != @last_slot_index
        @last_slot_index = @window_slotlist.index
        @window_slotdetail.draw_data(@last_slot_index + 1)
      end
      @help_window.update
      update_savefile_selection
    end
  end
  #--------------------------------------------------------------------------
  # * Update Save File Selection
  #--------------------------------------------------------------------------
  def update_savefile_selection
    if Input.trigger?(Input::C)
      if @saving and @window_slotdetail.file_exist?(@last_slot_index + 1)
        Sound.play_decision
        text1 = SFC_Text_Confirm
        text2 = SFC_Text_Cancel
        @confirm_window = Window_Command.new(SFC_Window_Width,[text1,text2])
        @confirm_window.x = ((544 - @confirm_window.width) / 2) + SFC_Window_X_Offset
        @confirm_window.y = ((416 - @confirm_window.height) / 2) + SFC_Window_Y_Offset
      else
        determine_savefile
      end
    elsif Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    end
  end
  #--------------------------------------------------------------------------
  # * Execute Save
  #--------------------------------------------------------------------------
  def do_save
 
    #if true, player is saving from inside menu
    if @saving
      file = File.open(make_filename(@last_slot_index), "wb")
    else
      #if here player has done a manual Auto_Save.new call from event
      s = SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { SAVE_NUMBER.to_s }
      file = File.open( s , "wb")
    end
    write_save_data(file)
    file.close
    $scene = Scene_Map.new if @saving
  end
  #--------------------------------------------------------------------------
  # * Execute Load
  #--------------------------------------------------------------------------
  def do_load
    file = File.open(make_filename(@last_slot_index), "rb")
    read_save_data(file)
    file.close
    $scene = Scene_Map.new
    RPG::BGM.fade(1500)
    Graphics.fadeout(60)
    Graphics.wait(40)
    @last_bgm.play
    @last_bgs.play
  end
  #--------------------------------------------------------------------------
  # * Confirm Save File
  #--------------------------------------------------------------------------
  def determine_savefile
 
    if @last_slot_index + 1 == SAVE_NUMBER
      saving_not_allowed if @saving
      return  if @saving
    end
 
    if @saving
      Sound.play_save
      do_save
    else
      if @window_slotdetail.file_exist?(@last_slot_index + 1)
        Sound.play_load
        do_load
      else
        Sound.play_buzzer
        return
      end
    end
    $game_temp.last_file_index = @last_slot_index
  end
 
  #window warning player can't save on auto save slot
  def saving_not_allowed
    Sound.play_buzzer
    b = Bitmap.new(340,60) 
    b.draw_text(0, 20,340, 20, "You can't save on the Auto Save slot.") 
    w = Window_Message.new
    w.contents = b
    w.width = 380
    w.height = 100
    w.visible = true
    w.openness = 255
    w.x = 100
    w.y = 180
    w.back_opacity = 255
    w.opacity = 255
    w.update
    Graphics.wait(180)
    b.dispose
    w.dispose
    w = nil
    b = nil
  end  
 
 
 
  #--------------------------------------------------------------------------
  # * Create Filename
  #     file_index : save file index (0-3)
  #--------------------------------------------------------------------------
  def make_filename(file_index)
    return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index + 1).to_s }
  end
  #--------------------------------------------------------------------------
  # * Select File With Newest Timestamp
  #--------------------------------------------------------------------------
  def latest_file_index
    latest_index = 0
    latest_time = Time.at(0)
    (1..MAX_SAVE_SLOT).each do |i|
      file_name = make_filename(i - 1)
      next if !@window_slotdetail.file_exist?(i)
      file_time = File.mtime(file_name)
      if file_time > latest_time
        latest_time = file_time
        latest_index = i - 1
      end
    end
    return latest_index
  end
end
 
class Window_SlotList < Window_Command
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index, enabled = true)
    rect = item_rect(index)
    rect.x += 4
    rect.width -= 8
    icon_index = 0
    self.contents.clear_rect(rect)
    if $scene.window_slotdetail.file_exist?(index + 1)
      icon_index = Wora_NSS::SAVED_SLOT_ICON
    else
      icon_index = Wora_NSS::EMPTY_SLOT_ICON
    end
    if !icon_index.nil?
      rect.x -= 4
      draw_icon(icon_index, rect.x, rect.y, enabled) # Draw Icon
      rect.x += 26
      rect.width -= 20
    end
    self.contents.clear_rect(rect)
    self.contents.font.color = normal_color
    self.contents.font.color.alpha = enabled ? 255 : 128
    self.contents.draw_text(rect, @commands[index]) if index + 1 != SAVE_NUMBER
    self.contents.draw_text(rect, "Auto Save") if index + 1 == SAVE_NUMBER
  end
 
  def cursor_down(wrap = false)
    if @index < @item_max - 1 or wrap
      @index = (@index + 1) % @item_max
    end
  end
 
  def cursor_up(wrap = false)
    if @index > 0 or wrap
      @index = (@index - 1 + @item_max) % @item_max
    end
  end
end
 
class Window_NSS_SlotDetail < Window_Base
  include Wora_NSS
  def initialize
    super(160, 56, 384, 360)
    @data = []
    @exist_list = []
    @bitmap_list = {}
    @map_name = []
  end
 
  def dispose
    dispose_tilemap
    super
  end
 
  def draw_data(slot_id)
    contents.clear # 352, 328
    dispose_tilemap
    load_save_data(slot_id) if @data[slot_id].nil?
    if @exist_list[slot_id]
      save_data = @data[slot_id]
      # DRAW SCREENSHOT~
      contents.fill_rect(0,30,352,160, MAP_BORDER)
      create_tilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
    save_data['gamemap'].display_y)
      if DRAW_GOLD
        # DRAW GOLD
        gold_textsize = contents.text_size(save_data['gamepar'].gold).width
        goldt_textsize = contents.text_size(GOLD_TEXT).width
        contents.font.color = system_color
        contents.draw_text(0, 0, goldt_textsize, WLH, GOLD_TEXT)
        contents.draw_text(goldt_textsize + gold_textsize,0,200,WLH, Vocab::gold)
        contents.font.color = normal_color
        contents.draw_text(goldt_textsize, 0, gold_textsize, WLH, save_data['gamepar'].gold)
      end
      if DRAW_PLAYTIME
        # DRAW PLAYTIME
        hour = save_data['total_sec'] / 60 / 60
        min = save_data['total_sec'] / 60 % 60
        sec = save_data['total_sec'] % 60
        time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
        pt_textsize = contents.text_size(PLAYTIME_TEXT).width
        ts_textsize = contents.text_size(time_string).width
        contents.font.color = system_color
        contents.draw_text(contents.width - ts_textsize - pt_textsize, 0,
        pt_textsize, WLH, PLAYTIME_TEXT)
        contents.font.color = normal_color
        contents.draw_text(0, 0, contents.width, WLH, time_string, 2)
      end
      if DRAW_LOCATION
        # DRAW LOCATION
        lc_textsize = contents.text_size(LOCATION_TEXT).width
        mn_textsize = contents.text_size(save_data['map_name']).width
        contents.font.color = system_color
        contents.draw_text(0, 190, contents.width,
        WLH, LOCATION_TEXT)
        contents.font.color = normal_color
        contents.draw_text(lc_textsize, 190, contents.width, WLH,
        save_data['map_name'])
      end
        # DRAW FACE & Level & Name
        save_data['gamepar'].members.each_index do |i|
          actor = save_data['gameactor'][save_data['gamepar'].members[i].id]
          face_x_base = (i*80) + (i*8)
          face_y_base = 216
          lvn_y_plus = 10
          lv_textsize = contents.text_size(actor.level).width
          lvt_textsize = contents.text_size(LV_TEXT).width
        if DRAW_FACE
          # Draw Face
          contents.fill_rect(face_x_base, face_y_base, 84, 84, FACE_BORDER)
          draw_face(actor.face_name, actor.face_index, face_x_base + 2,
          face_y_base + 2, 80)
        end
        if DRAW_LEVEL
          # Draw Level
          contents.font.color = system_color
          contents.draw_text(face_x_base + 2 + 80 - lv_textsize - lvt_textsize,
          face_y_base + 2 + 80 - WLH + lvn_y_plus, lvt_textsize, WLH, LV_TEXT)
          contents.font.color = normal_color
          contents.draw_text(face_x_base + 2 + 80 - lv_textsize,
          face_y_base + 2 + 80 - WLH + lvn_y_plus, lv_textsize, WLH, actor.level)
        end
        if DRAW_NAME
          # Draw Name
          contents.draw_text(face_x_base, face_y_base + 2 + 80 + lvn_y_plus - 6, 84,
          WLH, actor.name, 1)
        end
      end
    else
      contents.draw_text(0,0, contents.width, contents.height - WLH, EMPTY_SLOT_TEXT, 1)
    end
  end
 
  def load_save_data(slot_id)
    file_name = make_filename(slot_id)
    if file_exist?(slot_id) or FileTest.exist?(file_name)
      @exist_list[slot_id] = true
      @data[slot_id] = {}
      # Start load data
      file = File.open(file_name, "r")
      @data[slot_id]['time'] = file.mtime
      @data[slot_id]['char'] = Marshal.load(file)
      @data[slot_id]['frame'] = Marshal.load(file)
      @data[slot_id]['last_bgm'] = Marshal.load(file)
      @data[slot_id]['last_bgs'] = Marshal.load(file)
      @data[slot_id]['gamesys'] = Marshal.load(file)
      @data[slot_id]['gamemes'] = Marshal.load(file)
      @data[slot_id]['gameswi'] = Marshal.load(file)
      @data[slot_id]['gamevar'] = Marshal.load(file)
      @data[slot_id]['gameselfvar'] = Marshal.load(file)
      @data[slot_id]['gameactor'] = Marshal.load(file)
      @data[slot_id]['gamepar'] = Marshal.load(file)
      @data[slot_id]['gametro'] = Marshal.load(file)
      @data[slot_id]['gamemap'] = Marshal.load(file)
      @data[slot_id]['total_sec'] = @data[slot_id]['frame'] / Graphics.frame_rate
      @data[slot_id]['map_name'] = get_mapname(@data[slot_id]['gamemap'].map_id)
      file.close
    else
      @exist_list[slot_id] = false
      @data[slot_id] = -1
    end
  end
 
  def make_filename(file_index)
    return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index).to_s }
  end
 
  def file_exist?(slot_id)
    return @exist_list[slot_id] if !@exist_list[slot_id].nil?
    @exist_list[slot_id] = FileTest.exist?(make_filename(slot_id))
    return @exist_list[slot_id]
  end
 
  def get_mapname(map_id)
    if @map_data.nil?
      @map_data = load_data("Data/MapInfos.rvdata")
    end
    if @map_name[map_id].nil?
      if MAP_NO_NAME_LIST.include?(map_id)
        @map_name[map_id] = MAP_NO_NAME_NAME
      else
        @map_name[map_id] = @map_data[map_id].name
        MAP_NAME_TEXT_SUB.each_index do |i|
          @map_name[map_id].sub!(MAP_NAME_TEXT_SUB[i], '')
        end
      end
    end
    return @map_name[map_id]
  end
 
  def create_tilemap(map_data, ox, oy)
    @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
    @viewport.z = self.z
    @tilemap = Tilemap.new(@viewport)
    @tilemap.bitmaps[0] = Cache.system("TileA1")
    @tilemap.bitmaps[1] = Cache.system("TileA2")
    @tilemap.bitmaps[2] = Cache.system("TileA3")
    @tilemap.bitmaps[3] = Cache.system("TileA4")
    @tilemap.bitmaps[4] = Cache.system("TileA5")
    @tilemap.bitmaps[5] = Cache.system("TileB")
    @tilemap.bitmaps[6] = Cache.system("TileC")
    @tilemap.bitmaps[7] = Cache.system("TileD")
    @tilemap.bitmaps[8] = Cache.system("TileE")
    @tilemap.map_data = map_data
    @tilemap.ox = ox / 8 + 99
    @tilemap.oy = oy / 8 + 90
  end
 
  def dispose_tilemap
    unless @tilemap.nil?
      @tilemap.dispose
      @tilemap = nil
    end
  end
end
 
class Scene_Title < Scene_Base
  def check_continue
    file_name = Wora_NSS::SAVE_PATH + Wora_NSS::SAVE_FILE_NAME.gsub(/\{ID\}/i) { '*' }
    @continue_enabled = (Dir.glob(file_name).size > 0)
  end
end
 
################################################################################
class Scene_Menu < Scene_Base
  #save when exiting menu
  alias auto_save_bulletxt_update_command_selection update_command_selection
  def update_command_selection    
    if Input.trigger?(Input::B)
      Auto_Save.new if $game_switches[SAVE_AFTER_CLOSING_MENU] == false
    end
    auto_save_bulletxt_update_command_selection
  end
end
 
class Scene_Battle < Scene_Base
  #save after winning a battle
  alias auto_save_bulletxt_process_victory process_victory
  def process_victory
    auto_save_bulletxt_process_victory
    Auto_Save.new if $BTEST == false && $game_switches[SAVE_AFTER_WINNING_BATTLE] == false
  end
end
 
 
 
class Scene_Map < Scene_Base
  #save on map transfer
  alias auto_save_bulletxt_update_transfer_player  update_transfer_player
  def update_transfer_player
    return unless $game_player.transfer?
    auto_save_bulletxt_update_transfer_player
    Auto_Save.new if $game_switches[SAVE_ON_MAP_TRANSFER] == false
  end
end
 
#======================================================================
# END - NEO SAVE SYSTEM by Woratana
#======================================================================

highlight to read


Ich hoffe es findet sich jemand der zeit findet und helfen kann.

MfG

Kagurame

Alopex Lagopus

Motto: Ich Böse, Du Teufel

  • Send private message

2

Thursday, April 11th 2013, 10:37am

Bei file_index muss eine Zahl rein (0-3) und stellt den gewünschten Spielstand dar. Wenn du -1 rein schreibst, wird Save0 erstellt, so kannst du dann auch den Autosave von anderen Saves abgrenzen.
Bild

  • Hallo

    Tabs klicken unso, ne?
  • Lyric

    Meine schwarze Liste, beginnt mit einem Satz:
    "Wer zuletzt lacht, lacht am besten!", und am Ende ist noch Platz.
    Auf der Liste meiner Feinde, ist auch für euch noch Platz
    Wer zuletzt lacht, lacht am besten!
    Merkt euch diesen Satz!

    Ode an die Feindschaft von Saltatio Mortis

  • Outtakes

    • Nummer 3
      20.09.2012 - 19:46
      "Yah, ich bin ihre Motivazin." "Motivazin - gibts das jetzt in der Apotheke rezeptflichtig?"
    • Ich mag Kekse
    • Nummer 2
      08.09.2012 - 01:29 Uhr
      "Die Erlebnismacher zu Hannovre - Exlibre - ääääh... Excalibur"

      *Lachflash*
    • Nummer 1
      07.09.2012 - 22:58 Uhr
      *Bööarps* - Die Erlebnismacher zu Hannovre - Excalibur... "Mahlzeit... also... doch nicht Mahlzeit... war nur die Website"
      "Ich hab gerülpst -.-" "Du hast was?" *LACHFLASH*
      "Nicht dein Ernst, oder?" "DOCH!" *LACHFLASH second tour*
  • Profile

    Bild
  • Ich

    Dass bin ich:

    Maker: RPG-XP, RPG-VX
    Story:
    Für andere mehr als für mich: 60%

    Grafik:
    Ich werde besser: 35%

    Pixeln:
    Ich stehe an den Anfängen: 7%

    Mapping:
    Es fehlen nur noch (alle) Feinheiten: 67%

    Scripting:
    Informatiker, mittlerweile auch andere Sachen am skripten: 93%
  • Neues aus der SB

    Neues aus der SB:

    Spoiler: Die Camper
    (03:41:36) Kagurame: n8 du
    (03:41:37) Irrlicht: Nacht Mozilla
    (03:41:47) MozillaBabybird: Kagu: der witz war flach
    (03:42:01) Kagurame: welcher witz?
    (03:42:14) Heatra: geh nicht benji
    (03:42:21) Heatra: spiel lieber ats2 :D
    (03:42:25) MozillaBabybird: nacht leute ^^ ijemand sollte diesen verlauf im studio bash posten, damit die mal wissen wer die echten camper hier sind :D
    (03:42:35) Kagurame: ich bin scripten
    (03:42:38) MozillaBabybird: Heat: tut mir sorry xD
    (03:42:40) Kagurame: ich mach das...^^
    (03:42:48) MozillaBabybird: bis .... mittag ?
    (03:42:49) Heatra: ^^
    (03:42:55) MozillaBabybird: ja mittag dürfte passen
    (03:42:56) MozillaBabybird: :D
    (03:42:57) Kagurame: ^^
    (03:43:02) Heatra: ich steh morgen eh erst um 5 uhr mittags auf
    (03:43:07) Kagurame: bis heute
    (03:43:11) Steve: MozillaBabybird verlässt den Chat.
    (03:43:15) Kagurame: ich so um 3
    zum Lesen den Text mit der Maus markieren


    Spoiler: Die Informatiker vom Dienst
    (03:05:32) Ankou: bist du dir SICHER, dass es die Performance an der Stelle kritisch ist und c.a. 30% sind KEIN großer Unterschied?
    (03:05:41) Ankou: oh
    (03:05:45) Ankou: okay
    (03:06:21) Asandril: Oh Ha was habt Ihr gerade für ein Thema?
    (03:06:41) Ankou: das ist in der Tat eine performancekritische angelegenheit, aber ich denke dennoch nicht, dass das die Dinge sind auf die du dein Hauptaugenmerk richten solltest.
    (03:07:01) Heatra: maschine
    (03:07:01) Ankou: derartige Mikrooptimierungen werden Performanceprobleme sogut wie niemals beseitigen können
    (03:07:01) Irrlicht: anhand der Tatsache dass es 20 000 000 Durchläufe waren nicht wirklich :-/
    (03:07:08) Ankou: änder was konzeptionelles oder lass es bleiben.
    (03:07:31) Ankou: evtl. kannst du mehr der Interpretation nach vorne verlagern
    (03:08:06) Ankou: aber solche Dinge zu versuchen wie die case Abfragen durch send zu ersetzen in der Hoffnung ein paar Prozent einzusparen bringens dir nicht
    (03:08:26) Asandril: Bin ich gerade hier in einem Kurs gelandet ..
    (03:08:36) Irrlicht: hatte mal in Erwägung gezogen die Befehle evtl. schonmal etwas "vorzuinterpretieren", aber das dürfte dann mehr Speicher verbrauchen als es Geschwindigkeit bringt...
    (03:09:11) Ankou: Asandril: ja, erstaunlich, angetrunken an Silvester über so etwas zu reden
    (03:09:28) Heatra: -> lampenfieber
    (03:09:40) Asandril: Kann ich nur beipflichten.
    (03:09:46) Irrlicht: atm bin ich mir nicht sicher was genau den doch vergleichsweise erheblichen Lag von Parallel-Process-Events verursacht (oder ob es einfach an der gesammten Masse liegt) wenn ich bei 2 000 000 solcher Durchläufe unter einer Sek. bleibe...
    (03:09:57) Ankou: Irrlicht: das ist durchaus üblich. Speicher gegen Geschwindigkeit einzustauschen ist sehr populär und bringt oft viel
    (03:11:23) Irrlicht: mal schaun :)
    zum Lesen den Text mit der Maus markieren


    Spoiler: Auch noch später^^
    (03:32:35) (Kagurame_AnkündigungImForumMach): es da ne methode wie beim xp?
    (03:32:48) Irrlicht: Cache.system("Iconset")
    bekommst das Iconset
    (03:32:50) (Kagurame_AnkündigungImForumMach): brauche es dringend, aber nix gefunden bisher
    (03:33:01) (Kagurame_AnkündigungImForumMach): und dann per id?
    (03:33:06) (Kagurame_AnkündigungImForumMach): drauf zugreifen?
    (03:33:07) Irrlicht: Index berechnet sich einfach aus
    x = index % 16
    y = index / 16
    (03:33:17) Irrlicht: afaik warens 16 nebeneinander^^
    (03:33:28) (Kagurame_AnkündigungImForumMach): ok, danke.
    (03:33:51) (Kagurame_AnkündigungImForumMach): ich glaub ich scripte dann noch ein bissl
    (03:34:01) Steve: (Kagurame_AnkündigungImForumMach​) heißt jetzt Kagurame.
    (03:34:04) Irrlicht: im XP hast die einzelnen Icons anhand des Namens aus dem Icon-Ordner aufgerufen
    (03:34:09) Steve: Kagurame ist nun Scripten!
    (03:34:17) Irrlicht: (geht natürlich im VX auch, aber wozu gibts das Iconset)
    (03:34:23) Kagurame: ja ich weis, daher war ich heut mittag verwirrt
    zum Lesen den Text mit der Maus markieren

3

Thursday, April 11th 2013, 6:19pm

Leider scheint es nicht so einfach zu sein.
wenn ich nun testweise file_index durch eine zahl tausche oder die 1 nach dem plus verändere, kommt der gleiche fehler,
wenn ich das + 1 wegmache bekomme ich keinen fehler, aber er speichert dann den Screenshot zu dem Save falsch, sodass beim laden ein fehler kommt das
die Datei nicht gefunden werden kann.

MfG

Kagurame

Alopex Lagopus

Motto: Ich Böse, Du Teufel

  • Send private message

4

Thursday, April 11th 2013, 9:11pm

Du versteht das falsch. Die Methode ist richtig, nur der Aufruf ist falsch.

Ruby Source code

1
make_filename(2)
ergibt bspw. Save3.rvdata... In die Klammer muss ´ne Zahl.

Beim Aufruf, nicht an der gezeigten Stelle!
Bild

  • Hallo

    Tabs klicken unso, ne?
  • Lyric

    Meine schwarze Liste, beginnt mit einem Satz:
    "Wer zuletzt lacht, lacht am besten!", und am Ende ist noch Platz.
    Auf der Liste meiner Feinde, ist auch für euch noch Platz
    Wer zuletzt lacht, lacht am besten!
    Merkt euch diesen Satz!

    Ode an die Feindschaft von Saltatio Mortis

  • Outtakes

    • Nummer 3
      20.09.2012 - 19:46
      "Yah, ich bin ihre Motivazin." "Motivazin - gibts das jetzt in der Apotheke rezeptflichtig?"
    • Ich mag Kekse
    • Nummer 2
      08.09.2012 - 01:29 Uhr
      "Die Erlebnismacher zu Hannovre - Exlibre - ääääh... Excalibur"

      *Lachflash*
    • Nummer 1
      07.09.2012 - 22:58 Uhr
      *Bööarps* - Die Erlebnismacher zu Hannovre - Excalibur... "Mahlzeit... also... doch nicht Mahlzeit... war nur die Website"
      "Ich hab gerülpst -.-" "Du hast was?" *LACHFLASH*
      "Nicht dein Ernst, oder?" "DOCH!" *LACHFLASH second tour*
  • Profile

    Bild
  • Ich

    Dass bin ich:

    Maker: RPG-XP, RPG-VX
    Story:
    Für andere mehr als für mich: 60%

    Grafik:
    Ich werde besser: 35%

    Pixeln:
    Ich stehe an den Anfängen: 7%

    Mapping:
    Es fehlen nur noch (alle) Feinheiten: 67%

    Scripting:
    Informatiker, mittlerweile auch andere Sachen am skripten: 93%
  • Neues aus der SB

    Neues aus der SB:

    Spoiler: Die Camper
    (03:41:36) Kagurame: n8 du
    (03:41:37) Irrlicht: Nacht Mozilla
    (03:41:47) MozillaBabybird: Kagu: der witz war flach
    (03:42:01) Kagurame: welcher witz?
    (03:42:14) Heatra: geh nicht benji
    (03:42:21) Heatra: spiel lieber ats2 :D
    (03:42:25) MozillaBabybird: nacht leute ^^ ijemand sollte diesen verlauf im studio bash posten, damit die mal wissen wer die echten camper hier sind :D
    (03:42:35) Kagurame: ich bin scripten
    (03:42:38) MozillaBabybird: Heat: tut mir sorry xD
    (03:42:40) Kagurame: ich mach das...^^
    (03:42:48) MozillaBabybird: bis .... mittag ?
    (03:42:49) Heatra: ^^
    (03:42:55) MozillaBabybird: ja mittag dürfte passen
    (03:42:56) MozillaBabybird: :D
    (03:42:57) Kagurame: ^^
    (03:43:02) Heatra: ich steh morgen eh erst um 5 uhr mittags auf
    (03:43:07) Kagurame: bis heute
    (03:43:11) Steve: MozillaBabybird verlässt den Chat.
    (03:43:15) Kagurame: ich so um 3
    zum Lesen den Text mit der Maus markieren


    Spoiler: Die Informatiker vom Dienst
    (03:05:32) Ankou: bist du dir SICHER, dass es die Performance an der Stelle kritisch ist und c.a. 30% sind KEIN großer Unterschied?
    (03:05:41) Ankou: oh
    (03:05:45) Ankou: okay
    (03:06:21) Asandril: Oh Ha was habt Ihr gerade für ein Thema?
    (03:06:41) Ankou: das ist in der Tat eine performancekritische angelegenheit, aber ich denke dennoch nicht, dass das die Dinge sind auf die du dein Hauptaugenmerk richten solltest.
    (03:07:01) Heatra: maschine
    (03:07:01) Ankou: derartige Mikrooptimierungen werden Performanceprobleme sogut wie niemals beseitigen können
    (03:07:01) Irrlicht: anhand der Tatsache dass es 20 000 000 Durchläufe waren nicht wirklich :-/
    (03:07:08) Ankou: änder was konzeptionelles oder lass es bleiben.
    (03:07:31) Ankou: evtl. kannst du mehr der Interpretation nach vorne verlagern
    (03:08:06) Ankou: aber solche Dinge zu versuchen wie die case Abfragen durch send zu ersetzen in der Hoffnung ein paar Prozent einzusparen bringens dir nicht
    (03:08:26) Asandril: Bin ich gerade hier in einem Kurs gelandet ..
    (03:08:36) Irrlicht: hatte mal in Erwägung gezogen die Befehle evtl. schonmal etwas "vorzuinterpretieren", aber das dürfte dann mehr Speicher verbrauchen als es Geschwindigkeit bringt...
    (03:09:11) Ankou: Asandril: ja, erstaunlich, angetrunken an Silvester über so etwas zu reden
    (03:09:28) Heatra: -> lampenfieber
    (03:09:40) Asandril: Kann ich nur beipflichten.
    (03:09:46) Irrlicht: atm bin ich mir nicht sicher was genau den doch vergleichsweise erheblichen Lag von Parallel-Process-Events verursacht (oder ob es einfach an der gesammten Masse liegt) wenn ich bei 2 000 000 solcher Durchläufe unter einer Sek. bleibe...
    (03:09:57) Ankou: Irrlicht: das ist durchaus üblich. Speicher gegen Geschwindigkeit einzustauschen ist sehr populär und bringt oft viel
    (03:11:23) Irrlicht: mal schaun :)
    zum Lesen den Text mit der Maus markieren


    Spoiler: Auch noch später^^
    (03:32:35) (Kagurame_AnkündigungImForumMach): es da ne methode wie beim xp?
    (03:32:48) Irrlicht: Cache.system("Iconset")
    bekommst das Iconset
    (03:32:50) (Kagurame_AnkündigungImForumMach): brauche es dringend, aber nix gefunden bisher
    (03:33:01) (Kagurame_AnkündigungImForumMach): und dann per id?
    (03:33:06) (Kagurame_AnkündigungImForumMach): drauf zugreifen?
    (03:33:07) Irrlicht: Index berechnet sich einfach aus
    x = index % 16
    y = index / 16
    (03:33:17) Irrlicht: afaik warens 16 nebeneinander^^
    (03:33:28) (Kagurame_AnkündigungImForumMach): ok, danke.
    (03:33:51) (Kagurame_AnkündigungImForumMach): ich glaub ich scripte dann noch ein bissl
    (03:34:01) Steve: (Kagurame_AnkündigungImForumMach​) heißt jetzt Kagurame.
    (03:34:04) Irrlicht: im XP hast die einzelnen Icons anhand des Namens aus dem Icon-Ordner aufgerufen
    (03:34:09) Steve: Kagurame ist nun Scripten!
    (03:34:17) Irrlicht: (geht natürlich im VX auch, aber wozu gibts das Iconset)
    (03:34:23) Kagurame: ja ich weis, daher war ich heut mittag verwirrt
    zum Lesen den Text mit der Maus markieren

5

Friday, April 12th 2013, 4:39am

Hallo,
Achso das ist schonmal gut zu wissen.

Leider hilft mir diese Information nicht weiter.
In dem von mir dem Script hinzugefügen Code kommt diese Methode nicht vor.

Momentan bin ich ratlos (bin auch nur Anfänger).
Ich werd wohl später die Nagel im Heuhaufen suchen müssen. :D

MfG

Gmork

Krieger

Motto: Wer nur in die Fußstapfen anderer tritt, hinterlässt keine bleibenden Eindrücke.

  • Send private message

6

Saturday, April 13th 2013, 8:19pm

Hi killerpommes,

ich habe dein Problem soweit gelöst bis auf einen kleinen Bug so als Ankündigung. Später heute Abend
werde ich es hier dann posten können, ;)

Edit

Ganz gelöst habe ich es nicht, aber es funktioniert jetzt fast alles wie gewollt.

Beachte die Anmerkung im Skript:

Quoted

Anmerkung: Wenn du den Befehl "Auto_Save.new" oder "F10" als
"QUICK_SAVE_BUTTON" nutzen
möchtest, muss "SCREENSHOT_IMAGE" auf false stehen.
If this is true it will screenshot the map, if false it will draw it.
(SCREENSHOT_IMAGE = true)
Drawing the map is good because it doesn't require
a .DLL or images for the screenshot, and it will have tone and
weather. If you are using SwapXT and this value is false you need to turn
on swap tile.


AutoSave VX
Spoiler

Ruby Source code

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
=begin
                                  AutoSave VX
 
Author: BulleXt(bulletxt@gmail.com); Gmork
Version: 0.1
Date: 06/07/2009
 
Description:
This script by default will automatically save when you do a map transfer,
after winning a battle and after exiting menu.
You can also manually call an autosave inside an event by simply doing a
call script like this:
Auto_Save.new
The script doesn't disable normal saving system so player can still save on his
slots, he will not be able to overwrite the autosave slot.
The script also lets you set how many saving slots you want.
=end
 
#This is the autosave slot number
# (Do NOT change!)
SAVE_NUMBER = 1
 
#this is the number of how many saving slots you want
# (Do NOT change!)
NUMBER_OF_SAVE_SLOTS = 1
 
#This is an ID switch, if ON it disables the autosave on map transfer
SAVE_ON_MAP_TRANSFER = 1
 
#This is an ID switch, if ON it disables the autosave after winning a battle
SAVE_AFTER_WINNING_BATTLE = 2
 
#This is an ID switch, if ON it disables the autosave after closing Menu
SAVE_AFTER_CLOSING_MENU = 3
 
#This is an ID switch, if ON it allows the autosave by pressing F10
QUICK_SAVE_BUTTON = 4
 
############################### END CONFIGURATION ##############################
 
#==============================================================================
# ** Auto_Save
#------------------------------------------------------------------------------
#  Das Objekt dieser Klasse speichert automatisch in den Autosaveslot.
#=======================================================================
class Auto_Save < Scene_File
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    @last_slot_index = 0
     do_save
   end
end 
 
#==============================================================================
# ** Scene_Battle
#------------------------------------------------------------------------------
#  Die Abänderung der Klasse ermöglicht ein Speichern nach einem gewonnenen Kampf.
#=======================================================================
 
class Scene_Battle < Scene_Base
  #save after winning a battle
  alias auto_save_bulletxt_process_victory process_victory
  def process_victory
    auto_save_bulletxt_process_victory
    Auto_Save.new if $BTEST == false && $game_switches[SAVE_AFTER_WINNING_BATTLE] == false
  end
end
 
#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
#  Die Abänderung der Klasse ermöglicht ein Speichern nach einem Map-Transfer.
#======================================================================= 
class Scene_Map < Scene_Base
  #save on map transfer
  alias auto_save_bulletxt_update_transfer_player  update_transfer_player
  def update_transfer_player
    return unless $game_player.transfer?
    auto_save_bulletxt_update_transfer_player
    Auto_Save.new if $game_switches[SAVE_ON_MAP_TRANSFER] == false
  end
end
 
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
#  Die Abänderung der Klasse ermöglicht ein Speichern dem Verlassen den Menus.
#======================================================================= 
class Scene_Menu < Scene_Base
  #save when exiting menu
  alias auto_save_bulletxt_update_command_selection update_command_selection
  def update_command_selection    
    if Input.trigger?(Input::B)
      Auto_Save.new if $game_switches[SAVE_AFTER_CLOSING_MENU] == false
    end
    auto_save_bulletxt_update_command_selection
  end
end
 
#==============================================================================
# ** Game_Player
#------------------------------------------------------------------------------
#  This class handles maps. It includes event starting determinants and map
# scrolling functions. The instance of this class is referenced by $game_map.
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # * Processing when not moving
  #     last_moving : Was it moving previously?
  #--------------------------------------------------------------------------
  def update_nonmoving(last_moving)
    if not $game_message.visible and Input.trigger?(Input::F10)
      Auto_Save.new if $game_switches[QUICK_SAVE_BUTTON ] == false
    end
    return if $game_map.interpreter.running?
    return if moving?
    return if check_touch_event if last_moving
    if not $game_message.visible and Input.trigger?(Input::C)
      return if get_on_off_vehicle
      return if check_action_event
    end
    update_encounter if last_moving
  end
end
 
highlight to read

Neo Save System VI
Spoiler

Ruby Source code

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
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
#==========================================================================
# ● [VX] ◦ Neo Save System VI ◦ □
#---------------------------------------------------------------------------
# ◦ Author: Woratana [woratana@hotmail.com]; Gmork
# ◦ Thaiware RPG Maker Community
# ◦ Last Updated:
# ◦ Version: III -> VI (By Helladen) 
# ◦ Screenshot image credit Andreas21, and Cybersam
# ◦ Commerical usage ask Wortana.
#---------------------------------------------------------------------------
# ◦ Log VI:
# - Cleaned up comments and code format.
# - Added corresponding map variables system to MAP_NO_NAME.
# - Added where you can use premade images that use a map's name.
#---------------------------------------------------------------------------
# ◦ Log V:
# - Screenshot support for those who want tone/weather/sprites.
# - Added an option to stay in save screen after you save the game.
#---------------------------------------------------------------------------
# ◦ Log IV:
# - New addition for hiding map names. You can control the switch to
#   allow MAP_NO_NAME_LIST to work or not.
# - Revised some of the settings and script organization.
# - Added an option to disable the vocab::Gold text right of the number.
# - Added an option to use default opacity or not.
# - Swap tile compatibility support.
#---------------------------------------------------------------------------
# ◦ Log III:
# - Changed back to draw tile map for save image, don't need any image.
# - For drawing tile map, the characters won't show on the tile map.
#---------------------------------------------------------------------------
# ◦ Log II:
# - Screenshot DLL is not work with Vista Aero, so I remove it
#   and use image for each map instead of screenshot.
# - Actor's level in last version (V.1) is incorrect.
#---------------------------------------------------------------------------
# ◦ Features:
# - Unlimited save slots, you can choose max save slot
# - Many configuration options
# - Swap tile support
# - You can use image for scene's background
# - Choose your save file's name, and folder to store save files
# - Choose to show only information you want
# - Editable text for information's title
# - Draw tile map for map that player is currently on.
# - Remove text you don't want from map's name (e.g. tags for special script)
# - Choose map that you don't want to show the name on
# - Include save confirmation window before overwrite old save
#===========================================================================
 
module Wora_NSS Wora_NSS
  #==========================================================================
  # * START NEO SAVE SYSTEM - SETUP
  #--------------------------------------------------------------------------
  OPACITY_DEFAULT = true # This will use the default opacity for windows.
  # Please note that this will affect both opacitys below.
 
  NSS_WINDOW_OPACITY = 255 # All windows' opacity (Lowest 0 - 255 Highest).
 
  # You can change this to 0 in case you want to use image for background.
  NSS_IMAGE_BG = '' # Background image file name, it must be in folder picture
  #                   use '' for no background.
  NSS_IMAGE_BG_OPACITY = 255 # Opacity for background image.
 
  # If you use the screenshot method this does not matter.
  SWAP_TILE = true # Make this false if you don't use the swap_tile script
  SWAP_TILE_SWITCH = 84 # The switch needs to be the same as your swap tile
  #                       switch, but if SWAP_TILE is false it does not matter.
 
  # Anmerkung: Wenn du den Befehl "Auto_Save.new" oder "F10" als 
  #"QUICK_SAVE_BUTTON" nutzen 
  # möchtest, muss  "SCREENSHOT_IMAGE" auf false stehen.
  # If this is true it will screenshot the map, if false it will draw it.
  SCREENSHOT_IMAGE = true # Drawing the map is good because it doesn't require
  # a .DLL or images for the screenshot, and it will have tone and
  # weather. If you are using SwapXT and this value is false you need to turn
  # on swap tile.
 
  # Do you want to use your own custom images for each map via map name.
  PREMADE_IMAGE = false # If this is true it sets its priority over
  #                       screenshots/etc.
 
  # Image type for screenshot '.bmp', or '.jpg', or '.png'.
  IMAGE_FILETYPE = '.png'
 
  # If this is true then the scene will not change when you save the game. 
  SCENE_CHANGE = true # Changes scene to map instead of remaining in Save screen.
 
  MAX_SAVE_SLOT = 20 # Max save slots.
  SLOT_NAME = 'Stand {id}'
  ASAVE_NAME = 'Autosave'
 
  # Name of the slot (show in save slots list), use {id} for slot ID.
  SAVE_FILE_NAME = 'Save{id}.rvdata'
  # Save file name, you can also change its file type from .rvdata to other.
 
  # Use {id} for save slot ID.
  SAVE_PATH = '' # Path to store save file, e.g. 'Save/' or '' (for game folder).
  SAVED_SLOT_ICON = 133 # Icon Index for saved slot.
 
  EMPTY_SLOT_ICON = 141 # Icon Index for empty slot.
  EMPTY_SLOT_TEXT = 'Empty' # Text to show for empty slot's data.
 
  DRAW_GOLD = true # Draw Gold.
  DRAW_PLAYTIME = true # Draw playtime.
  DRAW_LOCATION = true # Draw location.
  DRAW_FACE = true # Draw actor's face.
  DRAW_LEVEL = true # Draw actor's level.
  DRAW_NAME = true # Draw actor's name.
  DRAW_TEXT_GOLD = false # Draw the vocab::Gold text to the right of the number.
 
  PLAYTIME_TEXT = 'Play Time: '
  GOLD_TEXT = 'Gold: '
  LOCATION_TEXT = 'Location: '
  LV_TEXT = 'Lv. '
 
  MAP_NAME_TEXT_SUB = %w{}
  # Text that you want to remove from map name,
  # e.g. %w{[LN] [DA]} will remove text '[LN]' and '[DA]' from map name.
 
  # Do we want to use corresponding variables for each map number in MAP_NO_NAME_LIST?
  MAP_NO_NAME_VARIABLE = true # You just apply the value one to the variable which
                              # is the map number to change it from MAP_NO_NAME.
 
  MAP_NO_NAME_LIST = [2] # ID of Map that will not show map name, e.g. [1,2,3].
  MAP_NO_NAME = '???' # What you will use to call the map in the no name list.
 
  # This is a switch that can activate or deactivate maps from being displayed as
  # MAP_NO_NAME. If it is off then maps will return back to normal.
  MAP_NO_NAME_SWITCH = 95 # This switch has to be on for MAP_NO_NAME_LIST to work.
 
  MAP_BORDER = Color.new(0,0,0,200) # Map image border color (R,G,B,Opacity).
  FACE_BORDER = Color.new(0,0,0,200) # Face border color.
 
  # Save confirmation window
  SFC_Text_Confirm = 'Confirm to save' # Text to confirm to save file.
  SFC_Text_Cancel = 'Cancel' # Text to cancel to save.
  SFC_Window_Width = 200 # Width of Confirmation Window.
  SFC_Window_X_Offset = 0 # Move Confirmation Window horizontally.
  SFC_Window_Y_Offset = 0 # Move Confirmation Window vertically.
 
  #-------------------------------------------------------------------------
  # END NEO SAVE SYSTEM - SETUP (Edit below at your own risk)
  #=========================================================================
 
  #-------------------------------------------------------------
  # Screenshot V2 by Andreas21 and Cybersam
  #-------------------------------------------------------------
  @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), ''
  @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
  @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' 
  module_function
 
  def self.shot(file_name)
    case IMAGE_FILETYPE
      when '.bmp'; typid = 0
      when '.jpg'; typid = 1
      when '.png'; typid = 2
    end
 
    # Get Screenshot
    filename = file_name + IMAGE_FILETYPE
    @screen.call(0, 0, Graphics.width, Graphics.height, filename, self.handel,
    typid)
  end
 
  def self.handel
    game_name = "\0" * 256
    @readini.call('Game','Title','',game_name,255,".\\Game.ini")
    game_name.delete!("\0")
 
    return @findwindow.call('RGSS Player',game_name)
  end
end
 
class Scene_File < Scene_Base
  include Wora_NSS
  attr_reader :window_slotdetail
 
  #-------------------------------------------------------------------------
  # * Start processing
  #-------------------------------------------------------------------------
  def start
    super
 
    create_menu_background
 
    if NSS_IMAGE_BG != ''
      @bg = Sprite.new
      @bg.bitmap = Cache.picture(NSS_IMAGE_BG)
      @bg.opacity = NSS_IMAGE_BG_OPACITY
    end
 
    @help_window = Window_Help.new
    command = []
    command << ASAVE_NAME.clone
    (2..MAX_SAVE_SLOT).each do |i|
      command << SLOT_NAME.clone.gsub!(/\{ID\}/i) { (i-1).to_s }
    end
 
    @window_slotdetail = Window_NSS_SlotDetail.new
    @window_slotlist = Window_SlotList.new(160, command)
    @window_slotlist.y = @help_window.height
    @window_slotlist.height = Graphics.height - @help_window.height
 
    if !OPACITY_DEFAULT
      @help_window.opacity = NSS_WINDOW_OPACITY
      @window_slotdetail.opacity = @window_slotlist.opacity = NSS_WINDOW_OPACITY
    end
 
    # Create folder for save file
    if SAVE_PATH != ''
      Dir.mkdir(SAVE_PATH) if !FileTest.directory?(SAVE_PATH)
    end
 
    if @saving
      @index = $game_temp.last_file_index
      @help_window.set_text(Vocab::SaveMessage)
    else
      @index = self.latest_file_index
      @help_window.set_text(Vocab::LoadMessage)
 
      (1..MAX_SAVE_SLOT).each do |i|
        @window_slotlist.draw_item(i-1, false) if !@window_slotdetail.file_exist?(i)
      end
    end
    if @index > 0 then
      @window_slotlist.index = @index
    else
      @window_slotlist.index =  1 
    end
 
    # Draw information
    @last_slot_index = @window_slotlist.index
    @window_slotdetail.draw_data(@last_slot_index + 1)
  end
 
  #--------------------------------------------------------------------------  
  # * Termination Processing
  #--------------------------------------------------------------------------
  def terminate
    super
 
    dispose_menu_background
 
    unless @bg.nil?
      @bg.bitmap.dispose
      @bg.dispose
    end
 
    @window_slotlist.dispose
    @window_slotdetail.dispose
    @help_window.dispose
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
 
    if !@confirm_window.nil?
      @confirm_window.update
 
      if Input.trigger?(Input::C)
        if @confirm_window.index == 0
          determine_savefile
          @confirm_window.dispose
          @confirm_window = nil
        else
          Sound.play_cancel
          @confirm_window.dispose
          @confirm_window = nil
        end
      elsif Input.trigger?(Input::B)
        Sound.play_cancel
        @confirm_window.dispose
        @confirm_window = nil
      end
    else
      update_menu_background
      @window_slotlist.update
 
      if @window_slotlist.index != @last_slot_index
        @last_slot_index = @window_slotlist.index
        @window_slotdetail.draw_data(@last_slot_index + 1)
      end
 
      @help_window.update
      update_savefile_selection
    end
  end
 
  #--------------------------------------------------------------------------
  # * Update Save File Selection
  #--------------------------------------------------------------------------
  def update_savefile_selection
    if Input.trigger?(Input::C)
      if @saving and @window_slotdetail.file_exist?(@last_slot_index + 1) and @window_slotlist.index >  0
        Sound.play_decision
        text1 = SFC_Text_Confirm
        text2 = SFC_Text_Cancel
        @confirm_window = Window_Command.new(SFC_Window_Width,[text1,text2])
        @confirm_window.x = ((544 - @confirm_window.width) / 2) + SFC_Window_X_Offset
        @confirm_window.y = ((416 - @confirm_window.height) / 2) + SFC_Window_Y_Offset
      else#if @saving #and @window_slotlist.index >  0
        determine_savefile
      end
    elsif Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    end
  end
 
  #--------------------------------------------------------------------------
  # * Execute Save
  #--------------------------------------------------------------------------
  def do_save
    if SCREENSHOT_IMAGE
        File.rename(SAVE_PATH + 'SaveScreen' + IMAGE_FILETYPE,
        ''.gsub(/\..*$/){ '_ss' } + IMAGE_FILETYPE)      
    end  
 
    file = File.open(make_filename(@last_slot_index), "wb")
    write_save_data(file)
    file.close   
 
    # Alter the scene after the saving is done
    if SCENE_CHANGE
      $scene = Scene_Map.new
    else
      $scene = Scene_File.new(true, false, false)
    end
  end
 
  #--------------------------------------------------------------------------
  # * Execute Load
  #--------------------------------------------------------------------------
  def do_load
    file = File.open(make_filename(@last_slot_index), "rb")
    read_save_data(file)
    file.close
    $scene = Scene_Map.new
    RPG::BGM.fade(1500)
    Graphics.fadeout(60)
    Graphics.wait(40)
    @last_bgm.play
    @last_bgs.play
  end
 
  #--------------------------------------------------------------------------
  # * Confirm Save File
  #--------------------------------------------------------------------------
  def determine_savefile
    if @saving and @window_slotlist.index >  0
      Sound.play_save
      do_save
    else
      if @window_slotdetail.file_exist?(@last_slot_index + 1) and not @saving
        Sound.play_load
        do_load
      else
        Sound.play_buzzer
        return
      end
    end
 
    $game_temp.last_file_index = @last_slot_index
  end
 
  #--------------------------------------------------------------------------
  # * Create Filename
  #     file_index : save file index (0-3)
  #--------------------------------------------------------------------------
  def make_filename(file_index)
    if file_index == 0
      return SAVE_PATH + 'Autosave.rvdata'
    else
      return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index + 1).to_s }
    end
  end
 
  #--------------------------------------------------------------------------
  # * Select File With Newest Timestamp
  #--------------------------------------------------------------------------
  def latest_file_index
    latest_index = 0
    latest_time = Time.at(0)
 
    (1..MAX_SAVE_SLOT).each do |i|
      file_name = make_filename(i - 1)
      next if !@window_slotdetail.file_exist?(i)
      file_time = File.mtime(file_name)
 
      if file_time > latest_time
        latest_time = file_time
        latest_index = i - 1
      end
    end
 
    return latest_index
  end
 
class Window_SlotList < Window_Command
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index, enabled = true)
    rect = item_rect(index)
    rect.x += 4
    rect.width -= 8
    icon_index = 0
    self.contents.clear_rect(rect)
 
    if $scene.window_slotdetail.file_exist?(index + 1)
      icon_index = Wora_NSS::SAVED_SLOT_ICON
    else
      icon_index = Wora_NSS::EMPTY_SLOT_ICON
    end
 
    if !icon_index.nil?
      rect.x -= 4
      draw_icon(icon_index, rect.x, rect.y, enabled) # Draw Icon
      rect.x += 26
      rect.width -= 20
    end
 
    self.contents.clear_rect(rect)
    self.contents.font.color = normal_color
    self.contents.font.color.alpha = enabled ? 255 : 128
    if index == 0
      self.contents.font.color = system_color
    end
    self.contents.draw_text(rect, @commands[index])
  end
 
  def cursor_down(wrap = false)
    if @index < @item_max - 1 or wrap
      @index = (@index + 1) % @item_max
    end
  end
 
  def cursor_up(wrap = false)
    if @index > 0 or wrap
      @index = (@index - 1 + @item_max) % @item_max
    end
  end
end
 
class Window_NSS_SlotDetail < Window_Base
  include Wora_NSS
 
  def initialize
    super(160, 56, 384, 360)
 
    @data = []
    @exist_list = []
    @bitmap_list = {}
    @map_name = []
  end
 
  def dispose
    dispose_tilemap
    super
  end
 
  def draw_data(slot_id)
    contents.clear # 352, 328
    dispose_tilemap
 
    load_save_data(slot_id) if @data[slot_id].nil?
      if @exist_list[slot_id]
        save_data = @data[slot_id]
        contents.fill_rect(0,30,352,152, MAP_BORDER)
 
        if PREMADE_IMAGE
          bitmap = get_bitmap("Graphics/Save/" + @data[slot_id]['map_name'] + IMAGE_FILETYPE)
          rect = Rect.new((Graphics.width-348)/2,(Graphics.height-156)/2,348,156)
          contents.blt(2,32,bitmap,rect)
        elsif SCREENSHOT_IMAGE and save_data['ss']
          bitmap = get_bitmap(save_data['ss_path'])
          rect = Rect.new((Graphics.width-348)/2,(Graphics.height-156)/2,348,156)
          contents.blt(2,32,bitmap,rect)
        elsif SWAP_TILE and $game_switches[SWAP_TILE_SWITCH]
          create_swaptilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
        else
          create_tilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
        end
 
        if DRAW_GOLD
          gold_textsize = contents.text_size(save_data['gamepar'].gold).width
          goldt_textsize = contents.text_size(GOLD_TEXT).width  
          contents.font.color = system_color
          contents.draw_text(0, 0, goldt_textsize, WLH, GOLD_TEXT)
          contents.font.color = normal_color
          contents.draw_text(goldt_textsize, 0, gold_textsize, WLH, save_data['gamepar'].gold)  
 
          if DRAW_TEXT_GOLD
            contents.draw_text(goldt_textsize + gold_textsize, 0, 200, WLH, Vocab::gold)
 
          else
            gold_textsize = 0
            goldt_textsize = 0                
          end
        end
 
        if DRAW_PLAYTIME
          hour = save_data['total_sec'] / 60 / 60
          min = save_data['total_sec'] / 60 % 60
          sec = save_data['total_sec'] % 60
          time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
          pt_textsize = contents.text_size(PLAYTIME_TEXT).width
          ts_textsize = contents.text_size(time_string).width
          contents.font.color = system_color
          contents.draw_text(contents.width - ts_textsize - pt_textsize, 0,
          pt_textsize, WLH, PLAYTIME_TEXT)
          contents.draw_text(goldt_textsize + gold_textsize,0,200,WLH, Vocab::gold)
          contents.font.color = normal_color
          contents.draw_text(0, 0, contents.width, WLH, time_string, 2)
        end
 
        if DRAW_LOCATION
          lc_textsize = contents.text_size(LOCATION_TEXT).width
          mn_textsize = contents.text_size(save_data['map_name']).width
          contents.font.color = system_color
          contents.draw_text(0, 190, contents.width, WLH, LOCATION_TEXT)
          contents.font.color = normal_color
          contents.draw_text(lc_textsize, 190, contents.width, WLH, save_data['map_name'])
        end
 
        # Draw level & name
        save_data['gamepar'].members.each_index do |i|
          actor = save_data['gameactor'][save_data['gamepar'].members[i].id]
          face_x_base = (i*80) + (i*8)
          face_y_base = 216
          lvn_y_plus = 10
          lv_textsize = contents.text_size(actor.level).width
          lvt_textsize = contents.text_size(LV_TEXT).width
 
        if DRAW_FACE
          contents.fill_rect(face_x_base, face_y_base, 84, 84, FACE_BORDER)
          draw_face(actor.face_name, actor.face_index, face_x_base + 2,
          face_y_base + 2, 80)
        end
 
        if DRAW_LEVEL
          contents.font.color = system_color
          contents.draw_text(face_x_base + 2 + 80 - lv_textsize - lvt_textsize,
          face_y_base + 2 + 80 - WLH + lvn_y_plus, lvt_textsize, WLH, LV_TEXT)
          contents.font.color = normal_color
          contents.draw_text(face_x_base + 2 + 80 - lv_textsize,
          face_y_base + 2 + 80 - WLH + lvn_y_plus, lv_textsize, WLH, actor.level)
        end
 
        if DRAW_NAME
          contents.draw_text(face_x_base, face_y_base + 2 + 80 + lvn_y_plus - 6, 84,
          WLH, actor.name, 1)
        end
      end
    else
      contents.draw_text(0,0, contents.width, contents.height - WLH, EMPTY_SLOT_TEXT, 1)
    end
  end
 
  def load_save_data(slot_id)
    file_name = make_filename(slot_id)
 
    if file_exist?(slot_id) or FileTest.exist?(file_name)
      @exist_list[slot_id] = true
      @data[slot_id] = {}
 
      # Start load data
      file = File.open(file_name, "r")
      @data[slot_id]['time'] = file.mtime
      @data[slot_id]['char'] = Marshal.load(file)
      @data[slot_id]['frame'] = Marshal.load(file)
      @data[slot_id]['last_bgm'] = Marshal.load(file)
      @data[slot_id]['last_bgs'] = Marshal.load(file)
      @data[slot_id]['gamesys'] = Marshal.load(file)
      @data[slot_id]['gamemes'] = Marshal.load(file)
      @data[slot_id]['gameswi'] = Marshal.load(file)
      @data[slot_id]['gamevar'] = Marshal.load(file)
      @data[slot_id]['gameselfvar'] = Marshal.load(file)
      @data[slot_id]['gameactor'] = Marshal.load(file)
      @data[slot_id]['gamepar'] = Marshal.load(file)
      @data[slot_id]['gametro'] = Marshal.load(file)
      @data[slot_id]['gamemap'] = Marshal.load(file)
      @data[slot_id]['total_sec'] = @data[slot_id]['frame'] / Graphics.frame_rate
 
      # Save the image
      if SCREENSHOT_IMAGE
        @data[slot_id]['ss_path'] = file_name.gsub(/\..*$/){'_ss'} + IMAGE_FILETYPE
        @data[slot_id]['ss'] = FileTest.exist?(@data[slot_id]['ss_path'])
      end
 
      @data[slot_id]['map_name'] = get_mapname(@data[slot_id]['gamemap'].map_id)
      file.close
    else
      @exist_list[slot_id] = false
      @data[slot_id] = -1
    end
  end
 
  def make_filename(file_index)
    if file_index == 1
      return SAVE_PATH + 'Autosave.rvdata'
    else
      return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index).to_s }
    end
  end 
 
  def file_exist?(slot_id)
    return @exist_list[slot_id] if !@exist_list[slot_id].nil?
 
    @exist_list[slot_id] = FileTest.exist?(make_filename(slot_id))
 
    return @exist_list[slot_id]
  end
 
  def get_bitmap(path)
    if !@bitmap_list.include?(path)
      @bitmap_list[path] = Bitmap.new(path)
    end
 
    return @bitmap_list[path]
  end
 
  def get_mapname(map_id)
    if @map_data.nil?
      @map_data = load_data("Data/MapInfos.rvdata")
    end
 
    if @map_name[map_id].nil?
      if MAP_NO_NAME_LIST.include?(map_id) and $game_switches[MAP_NO_NAME_SWITCH]
        if $game_variables[map_id] == 0 or !MAP_NO_NAME_VARIABLE
          @map_name[map_id] = MAP_NO_NAME
        else
          @map_name[map_id] = @map_data[map_id].name
        end  
      else
        @map_name[map_id] = @map_data[map_id].name
      end
 
      MAP_NAME_TEXT_SUB.each_index do |i|
        @map_name[map_id].sub!(MAP_NAME_TEXT_SUB[i], '')
        @mapname = @map_name[map_id]
      end 
    end
 
    return @map_name[map_id] 
  end   
 
  def create_tilemap(map_data, ox, oy)
    @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
    @viewport.z = self.z
    @tilemap = Tilemap.new(@viewport)
    @tilemap.bitmaps[0] = Cache.system("TileA1")
    @tilemap.bitmaps[1] = Cache.system("TileA2")
    @tilemap.bitmaps[2] = Cache.system("TileA3")
    @tilemap.bitmaps[3] = Cache.system("TileA4")
    @tilemap.bitmaps[4] = Cache.system("TileA5")
    @tilemap.bitmaps[5] = Cache.system("TileB")
    @tilemap.bitmaps[6] = Cache.system("TileC")
    @tilemap.bitmaps[7] = Cache.system("TileD")
    @tilemap.bitmaps[8] = Cache.system("TileE")
    @tilemap.map_data = map_data
    @tilemap.ox = ox / 8 + 99
    @tilemap.oy = oy / 8 + 90
  end
 
  def create_swaptilemap(map_data, ox, oy)
    @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
    @viewport.z = self.z
    @tilemap = Tilemap.new(@viewport)
 
    tile1 = Cache_Swap_Tiles.swap($tileA1 + ".png") rescue nil
    tile2 = Cache_Swap_Tiles.swap($tileA2 + ".png") rescue nil
    tile3 = Cache_Swap_Tiles.swap($tileA3 + ".png") rescue nil
    tile4 = Cache_Swap_Tiles.swap($tileA4 + ".png") rescue nil
    tile5 = Cache_Swap_Tiles.swap($tileA5 + ".png") rescue nil
    tile6 = Cache_Swap_Tiles.swap($tileB + ".png") rescue nil
    tile7 = Cache_Swap_Tiles.swap($tileC + ".png") rescue nil
    tile8 = Cache_Swap_Tiles.swap($tileD + ".png") rescue nil
    tile9 = Cache_Swap_Tiles.swap($tileE + ".png") rescue nil
 
    if $tileA1 != nil
      @tilemap.bitmaps[0] = tile1
    else
      @tilemap.bitmaps[0] = Cache.system("TileA1")
    end
 
    if $tileA2 != nil
      @tilemap.bitmaps[1] = tile2
    else
      @tilemap.bitmaps[1] = Cache.system("TileA2")
    end
 
    if $tileA3 != nil
      @tilemap.bitmaps[2] = tile3  
    else
      @tilemap.bitmaps[2] = Cache.system("TileA3")
    end  
 
    if $tileA4 != nil
      @tilemap.bitmaps[3] = tile4
    else
      @tilemap.bitmaps[3] = Cache.system("TileA4")
    end
 
    if $tileA5 != nil
      @tilemap.bitmaps[4] = tile5  
    else
      @tilemap.bitmaps[4] = Cache.system("TileA5")
    end
 
    if $tileB != nil
      @tilemap.bitmaps[5] = tile6
    else
      @tilemap.bitmaps[5] = Cache.system("TileB")  
    end  
 
    if $tileC != nil
      @tilemap.bitmaps[6] = tile7
    else
      @tilemap.bitmaps[6] = Cache.system("TileC")
    end  
 
    if $tileD != nil
      @tilemap.bitmaps[7] = tile8
    else
      @tilemap.bitmaps[7] = Cache.system("TileD")  
    end
 
    if $tileE != nil
      @tilemap.bitmaps[8] = tile9
    else
      @tilemap.bitmaps[8] = Cache.system("TileE")  
    end
 
    @tilemap.map_data = map_data
    @tilemap.ox = ox / 8 + 99
    @tilemap.oy = oy / 8 + 90
  end
 
  def dispose_tilemap
    unless @tilemap.nil?
      @tilemap.dispose
      @tilemap = nil
      end
    end
  end
end
 
class Scene_Title < Scene_Base
  def check_continue
    file_name = Wora_NSS::SAVE_PATH + Wora_NSS::SAVE_FILE_NAME.gsub(/\{ID\}/i) { '*' }
    @continue_enabled = (Dir.glob(file_name).size > 0)
    if not @continue_enabled
      file_name = Wora_NSS::SAVE_PATH + 'Autosave.rvdata'
      @continue_enabled = (Dir.glob(file_name).size > 0)
    end
  end
end
 
class Scene_Map < Scene_Base
  alias wora_nss_scemap_ter terminate
 
  def terminate
    Wora_NSS.shot(Wora_NSS::SAVE_PATH + 'SaveScreen')
    wora_nss_scemap_ter
  end
end
#======================================================================
# END - NEO SAVE SYSTEM by Woratana and Helladen
#======================================================================
highlight to read


LG Gmork
  • :puzzle: Aktuelles aus anderen Foren

    Bild
  • Mein Projekt(1.Demo):block:

    Ich arbeite zur Zeit an der Demo meines Projektes "Mosferia".
    Geplant als Erscheinungstermin ist der November 2013.

    Bisher könnt ihr nur einen nicht mehr aktuellen Screen zum Projekt in
    meinem Profil bewundern, aber demnächst werde ich weiteres präsentieren.
  • Meine Ressourcen :palette:

  • Mein Avatar :mask:

    Der Ersteller der ursprünglichen Zeichnung meines aktuellen Avatars:
    Bild

This post has been edited 1 times, last edit by "Gmork" (Apr 13th 2013, 8:19pm)


7

Sunday, April 14th 2013, 10:43am

Hi erstmaldanke :)

bei deinen scripts bekomme ich den fehler
Script 'AutoSave VX' line 114: NameError occurred.
uninitialized constant Input::F10

Dieser Fehler kommt wohl daher das die Taste F10 vom Maker aus nicht belegt/gefunden werden kann.
Habe es auf Q geändert und es scheint zu laufen.
Gibt es da Scripts um auf die Taste zugreifen zu können?
EDIT: hmm mit einem anderen Projekt scheint es zu gehen.

Schön wäre es noch wenn die Schrift vom Autosave im Ladebildschirm normal gefärbt wäre.

Ansonsten danke es funktioniert nicht perfekt aber das was er machen soll funktioniert.

Perfekt wäre es, wenn das screenshot kram, funktionieren würde :)

This post has been edited 3 times, last edit by "killerpommes" (Apr 14th 2013, 1:37pm)


Gmork

Krieger

Motto: Wer nur in die Fußstapfen anderer tritt, hinterlässt keine bleibenden Eindrücke.

  • Send private message

8

Sunday, April 14th 2013, 3:05pm

Oh, tut mir Leid, ich habe vergessen dasSkript hier anzuhängen, welches ich noch benutzt habe. :schock:
Spoiler

Ruby Source code

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
#===============================================================================
# 
# OriginalWij and Yanfly Collaboration - Keyboard Input
# Last Date Updated: 2010.06.12
# Level: Normal
# 
# This is a utility script that provides the functionality to return inputs
# from the keyboard as well as free up more keys to be used in the Input module.
# This script will also replace Scene_Name and allow for direct keyboard input
# to type in an actor's name as well as fix the maximum characters shown from
# the default base script.
# 
#===============================================================================
# Updates
# -----------------------------------------------------------------------------
# o 2010.06.12 - Started and Finished Script.
#===============================================================================
# Instructions
# -----------------------------------------------------------------------------
# To install this script, open up your script editor and copy/paste this script
# to an open slot below ▼ Materials but above ▼ Main. Remember to save.
# 
# For users:
#   The Name Input event has been now replaced. It not longer takes you to the
#   name entry scene, but instead, allows the player to enter in the name of
#   the desired actor right in the current screen itself without needing to
#   change the scene altogether.
# 
# For scripters:
#   For those curious as to how to retrieve certain letters while coding their
#   Input commands, use the following as reference
#   
#   LETTERS['A'] through LETTERS['Z']
#     This returns true if the respective letter from A through Z is pressed.
#   
#   NUMBERS[0] through NUMBERS[9]
#     This returns true if the respective number on the top row of the keyboard
#     is pressed. This does not include the numberpad.
#   
#   NUMPAD[0] through NUMPAD[9]
#     This returns true if the respective number in the number pad is pressed.
#     This does not include the numbers found at the top row of the keyboard.
#   
#   Symbol Keys
#     
#     USCORE  - This returns true if the - key is pressed.
#     EQUALS  - This returns true if the = key is pressed.
#     SCOLON  - This returns true if the ; key is pressed.
#     QUOTE   - This returns true if the ' key is pressed.
#     COMMA   - This returns true if the , key is pressed.
#     PERIOD  - This returns true if the . key is pressed.
#     SLASH   - This returns true if the / key is pressed.
#     BSLASH  - This returns true if the \ key is pressed.
#     LBRACE  - This returns true if the [ key is pressed.
#     RBRACE  - This returns true if the ] key is pressed.
#     TILDE   - This returns true if the ~ key is pressed.
#   
#   Command Keys
#     
#     BACK    - This returns true if the backspace key is pressed.
#     ENTER   - This returns true if the enter/return key is pressed.
#     SPACE   - This returns true if the space bar is pressed.
#     ESC     - This returns true if the escape key is pressed.
#   
#   Module Methods
#     
#     Input.typing?
#       To check if typing is occurring. Returns true or false.
#     
#     Input.key_type
#       Returns whatever key is being used to type as a string.
#   
#   Example:
#   
#     if Input.typing?
#       string = Input.key_type
#     end
# 
#===============================================================================
 
$imported = {} if $imported == nil
$imported["KeyboardInput"] = true
 
#===============================================================================
# Editting anything past this point may potentially result in causing computer
# damage, incontinence, explosion of user's head, coma, death, and/or halitosis.
# Therefore, edit at your own risk.
#===============================================================================
 
#===============================================================================
# Input
#===============================================================================
 
class << Input  
  #--------------------------------------------------------------------------
  # Aliases (Mods - Linked to Module) - Created by OriginalWij
  #--------------------------------------------------------------------------
  alias ow_dt_i_press press? unless $@
  alias ow_dt_i_trigger trigger? unless $@
  alias ow_dt_i_repeat repeat? unless $@
  alias ow_dt_i_update update unless $@
end
 
module Input
  #--------------------------------------------------------------------------
  # constants - Created by OriginalWij and Yanfly
  #--------------------------------------------------------------------------
  LETTERS = {}        
  LETTERS['A'] = 65; LETTERS['B'] = 66; LETTERS['C'] = 67; LETTERS['D'] = 68
  LETTERS['E'] = 69; LETTERS['F'] = 70; LETTERS['G'] = 71; LETTERS['H'] = 72
  LETTERS['I'] = 73; LETTERS['J'] = 74; LETTERS['K'] = 75; LETTERS['L'] = 76
  LETTERS['M'] = 77; LETTERS['N'] = 78; LETTERS['O'] = 79; LETTERS['P'] = 80
  LETTERS['Q'] = 81; LETTERS['R'] = 82; LETTERS['S'] = 83; LETTERS['T'] = 84
  LETTERS['U'] = 85; LETTERS['V'] = 86; LETTERS['W'] = 87; LETTERS['X'] = 88
  LETTERS['Y'] = 89; LETTERS['Z'] = 90
  NUMBERS = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57]
  NUMPAD = [96, 97, 98, 99, 100, 101, 102, 103, 104, 105] 
  BACK   = 138; ENTER  = 143; SPACE  = 32;  SCOLON = 186; ESC    = 157
  QUOTE  = 222; EQUALS = 187; COMMA  = 188; USCORE = 189; PERIOD = 190
  SLASH  = 191; LBRACE = 219; RBRACE = 221; BSLASH = 220; TILDE  = 192
  F10    = 121; F11    = 122; CAPS   = 20;  NMUL   = 106; NPLUS  = 107
  NSEP   = 108; NMINUS = 109; NDECI  = 110; NDIV   = 111; Extras = 
  [USCORE, EQUALS, LBRACE, RBRACE, BSLASH, SCOLON, QUOTE, COMMA, PERIOD, SLASH,
   NMUL, NPLUS, NSEP, NMINUS, NDECI, NDIV]
 
  #--------------------------------------------------------------------------
  # initial module settings - Created by OriginalWij and Yanfly
  #--------------------------------------------------------------------------
  GetKeyState = Win32API.new("user32", "GetAsyncKeyState", "i", "i") 
  GetCapState = Win32API.new("user32", "GetKeyState", "i", "i") 
  KeyRepeatCounter = {}
  module_function 
  #--------------------------------------------------------------------------
  # alias method: update - Created by OriginalWij
  #--------------------------------------------------------------------------
  def update
    ow_dt_i_update
    for key in KeyRepeatCounter.keys
      if (GetKeyState.call(key).abs & 0x8000 == 0x8000)
        KeyRepeatCounter[key] += 1
      else
        KeyRepeatCounter.delete(key)
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # alias method: press? - Created by OriginalWij
  #--------------------------------------------------------------------------
  def press?(key)
    return ow_dt_i_press(key) if key < 30
    adjusted_key = adjust_key(key)
    return true unless KeyRepeatCounter[adjusted_key].nil?
    return key_pressed?(adjusted_key)
  end
 
  #--------------------------------------------------------------------------
  # alias method: trigger? - Created by OriginalWij
  #--------------------------------------------------------------------------
  def trigger?(key)
    return ow_dt_i_trigger(key) if key < 30
    adjusted_key = adjust_key(key)
    count = KeyRepeatCounter[adjusted_key]
    return ((count == 0) or (count.nil? ? key_pressed?(adjusted_key) : false))
  end
 
  #--------------------------------------------------------------------------
  # alias method: repeat? - Created by OriginalWij
  #--------------------------------------------------------------------------
  def repeat?(key)
    return ow_dt_i_repeat(key) if key < 30
    adjusted_key = adjust_key(key)
    count = KeyRepeatCounter[adjusted_key]
    return true if count == 0
    if count.nil?
      return key_pressed?(adjusted_key)
    else
      return (count >= 23 and (count - 23) % 6 == 0)
    end
  end
 
  #--------------------------------------------------------------------------
  # new method: adjust_key - Created by OriginalWij
  #--------------------------------------------------------------------------
  def adjust_key(key)
    key -= 130 if key.between?(130, 158)
    return key
  end
 
  #--------------------------------------------------------------------------
  # new method: key_pressed? - Created by OriginalWij
  #--------------------------------------------------------------------------
  def key_pressed?(key)
    if (GetKeyState.call(key).abs & 0x8000 == 0x8000)
      KeyRepeatCounter[key] = 0
      return true
    end
    return false
  end
 
  #--------------------------------------------------------------------------
  # new method: typing? - Created by Yanfly
  #--------------------------------------------------------------------------
  def typing?
    return true if repeat?(SPACE)
    for i in 'A'..'Z'
      return true if repeat?(LETTERS[i])
    end
    for i in 0...NUMBERS.size
      return true if repeat?(NUMBERS[i])
      return true if repeat?(NUMPAD[i])
    end
    for key in Extras
      return true if repeat?(key)
    end
    return false
  end
 
  #--------------------------------------------------------------------------
  # new method: key_type - Created by Yanfly
  #--------------------------------------------------------------------------
  def key_type
    return " " if repeat?(SPACE)
    for i in 'A'..'Z'
      next unless repeat?(LETTERS[i])
      return upcase? ? i.upcase : i.downcase
    end
    for i in 0...NUMBERS.size
      return i.to_s if repeat?(NUMPAD[i])
      if !press?(SHIFT)
        return i.to_s if repeat?(NUMBERS[i])
      elsif repeat?(NUMBERS[i])
        case i
        when 1; return "!"
        when 2; return "@"
        when 3; return "#"
        when 4; return "$"
        when 5; return "%"
        when 6; return "^"
        when 7; return "&"
        when 8; return "*"
        when 9; return "("
        when 0; return ")"
        end
      end
    end
    for key in Extras
      next unless repeat?(key)
      case key
      when USCORE; return press?(SHIFT) ? "_" : "-"
      when EQUALS; return press?(SHIFT) ? "+" : "="
      when LBRACE; return press?(SHIFT) ? "{" : "["
      when RBRACE; return press?(SHIFT) ? "}" : "]"
      when BSLASH; return press?(SHIFT) ? "|" : "\\"
      when SCOLON; return press?(SHIFT) ? ":" : ";"
      when QUOTE;  return press?(SHIFT) ? '"' : "'"
      when COMMA;  return press?(SHIFT) ? "<" : ","
      when PERIOD; return press?(SHIFT) ? ">" : "."
      when SLASH;  return press?(SHIFT) ? "?" : "/"
      when NMUL;   return "*"
      when NPLUS;  return "+"
      when NSEP;   return ","
      when NMINUS; return "-"
      when NDECI;  return "."
      when NDIV;   return "/"
      end
    end
    return ""
  end
 
  #--------------------------------------------------------------------------
  # new method: upcase? - Created by Yanfly
  #--------------------------------------------------------------------------
  def upcase?
    return !press?(SHIFT) if GetCapState.call(CAPS) == 1
    return true if press?(SHIFT)
    return false
  end
 
end # Input
 
#===============================================================================
# Game_Interpreter
#===============================================================================
 
class Game_Interpreter
 
  #--------------------------------------------------------------------------
  # overwrite method: command_303 (Name Input Processing)
  #--------------------------------------------------------------------------
  def command_303
    if $data_actors[@params[0]] != nil
      $scene.name_entry(@params[0], @params[1])
    end
    @index += 1
    return false
  end
 
end # Game_Interpreter
 
#===============================================================================
# Window_NameEdit
#===============================================================================
 
class Window_NameEdit < Window_Base
 
  #--------------------------------------------------------------------------
  # overwrite method: initialize
  #--------------------------------------------------------------------------
  def initialize(actor, max_char)
    dw = Graphics.width - 176
    dy = (Graphics.height - 128) / 2
    if $game_message.visible
      difference = Graphics.height - 128
      case $game_message.position
      when 0; dy += 64
      when 1; dy += 0
      when 2; dy -= 64
      end
    end
    super(88, dy, dw, 128)
    @actor = actor
    @name = actor.name
    @max_char = max_char
    name_array = @name.split(//)[0...@max_char]
    @name = ""
    for i in 0...name_array.size
      @name += name_array[i]
    end
    @default_name = @name
    @index = name_array.size
    self.active = false
    refresh
    update_cursor
  end
 
  #--------------------------------------------------------------------------
  # overwrite method: item_rect
  #--------------------------------------------------------------------------
  def item_rect(index)
    if index == @max_char
      rect = Rect.new(0, 0, 0, 0)
    else
      rect = Rect.new(0, 0, 0, 0)
      rect.x = 112 + index * 12
      rect.y = 36
      rect.width = 24
      rect.height = WLH
    end
    return rect
  end
 
end # Window_NameEdit
 
#===============================================================================
# Scene_Base
#===============================================================================
 
class Scene_Base
 
  #--------------------------------------------------------------------------
  # new method: name_entry
  #--------------------------------------------------------------------------
  def name_entry(actor_id, max_char)
    @name_actor_id = actor_id
    @name_entry_max = max_char
    start_name_entry
    end_name_entry
  end
 
  #--------------------------------------------------------------------------
  # new method: start_name_entry
  #--------------------------------------------------------------------------
  def start_name_entry
    Graphics.freeze
    actor = $game_actors[@name_actor_id]
    @edit_window = Window_NameEdit.new(actor, @name_entry_max)
    Graphics.transition(10)
    loop do
      update_name_entry
      if Input.repeat?(Input::BACK) and @edit_window.index > 0
        Sound.play_cancel
        @edit_window.back
      elsif Input.typing? and @edit_window.index != @edit_window.max_char
        Sound.play_cursor
        @edit_window.add(Input.key_type)
      elsif Input.trigger?(Input::ENTER)
        Sound.play_decision
        actor.name = @edit_window.name
        break
      elsif Input.trigger?(Input::ESC)
        Sound.play_cancel
        break
      end
    end
  end
 
  #--------------------------------------------------------------------------
  # new method: update_name_entry
  #--------------------------------------------------------------------------
  def update_name_entry
    update_menu_background
    Graphics.update
    Input.update
    if $scene.is_a?(Scene_Map)
      $game_map.update
      @spriteset.update
    elsif $scene.is_a?(Scene_Battle)
      Graphics.update
      Input.update
      $game_system.update
      $game_troop.update
      @spriteset.update
      @message_window.update
    end
    @edit_window.update
  end
 
  #--------------------------------------------------------------------------
  # end_name_entry
  #--------------------------------------------------------------------------
  def end_name_entry
    @edit_window.dispose
    @edit_window = nil
    @name_actor_id = nil
    @name_entry_max = nil
  end
 
end # Scene_Base
 
#===============================================================================
# 
# END OF FILE
# 
#===============================================================================
highlight to read


Das mit dem Screenshot-Zeug ist eine Sache, die ich ehrlich gesagt nicht verstehe. Mir fehlt der Ansatz wie ich das Problem angehen kann.
Vielleicht kennt sich hier ja ein anderer besser damit aus.

Die Schriftfarbe habe ich geändert, weil ich dachte es sieht besser aus. Wenn du es lieber anders haben willst, gehe in Zeile
549 vom Neo Save System und kommentiere diese aus. (Einfach ein # davorsetzen, aber ich denke das ist klar.)

LG Gmork
  • :puzzle: Aktuelles aus anderen Foren

    Bild
  • Mein Projekt(1.Demo):block:

    Ich arbeite zur Zeit an der Demo meines Projektes "Mosferia".
    Geplant als Erscheinungstermin ist der November 2013.

    Bisher könnt ihr nur einen nicht mehr aktuellen Screen zum Projekt in
    meinem Profil bewundern, aber demnächst werde ich weiteres präsentieren.
  • Meine Ressourcen :palette:

  • Mein Avatar :mask:

    Der Ersteller der ursprünglichen Zeichnung meines aktuellen Avatars:
    Bild

Similar threads

Social bookmarks