KMapData - kyonides - 07-02-2020
KMapData
version 0.4.0
by Kyonides Arkanthes
Introduction
Did you ever want to keep track of how many chests the player has found? Or did you need to record how many traps the player has triggered so far? Or you wanted to save which switches the player turned on and off and in which order he did it?
Now you can do it!
! The direct script call to change the required number of monster encounter steps has been included already.
! By the way, you can also modify the default behavior of the monster encounter steps micro system.
Just follow the instructions already included in my script.
Notes
There is no screenshot available for there's no menu included here.
KMapData Main Script
Code: # * KMapData
# Scripter : Kyonides Arkanthes
# 2020-07-06 - v0.4.0
# This scriptlet allows you to keep track of the chest you've found on the map
# and all the traps you've triggered so far.
# I guess the latter could be helpful to design a system where you can keep
# track of many chests and traps without using any game variables. You can clear
# a map's data at any time if deemed necessary.
# It's also possible to keep track of switches a player needs to turn on or off.
# You still need to setup the initial values of a few CONSTANTS listed in the
# KMap module! Some of them allow you to modify the default behavoir of the
# number of steps required to encounter a monster.
# * Script Calls *
# To easily get your current Map ID - Script Command Box Only!
# @map_id
# To toggle any map's Fixed Number of Steps
# $game_system.fixed_steps = true or false
# To divide the Number of Steps
# $game_system.steps_reducer = 1 -> No Division - Default Behavior
# $game_system.steps_reducer = 2 or greater -> Steps / Steps Reduction
# $game_system.steps_reducer = 0 -> Game Crash! ZeroDivisionError!!
# To increase the Total Number of Chests Found on the current Map
# $game_party.chests_found[MapID] += 1
# To increase the Total Number of Traps Triggered on the current Map
# $game_party.traps_triggered[MapID] += 1
# To clear any map's data - Options: Defined in CLEAR_DATA_OPTIONS constant
# $game_party.clear_data(Option) - For the current map
# $game_party.clear_data(Option, MapID) - For any other map
# To check if the player has found enough chests and has not triggered too many
# traps on a specific map
# KMap.pass_chest_trap_test? - For Current Map
# KMap.pass_chest_trap_test?(MapID) - For Any Other Map
# To check if the player triggered the right switches in the right order
# KMap.pass_switch_order? - For Current Map
# KMap.pass_switch_order?(MapID) - For Any Other Map
# To set a map's Switch Order
# -> Predefined Order
# KMap.map_switch_order[MapID] = [1, 3, 5, etc.]
# -> Player's Input
# Assign a value to the Game Variable set in SWITCH_ORDER_VAR constant for
# each separate switch by clicking on Control Variables.
# It does not matter if the player turns it ON or OFF at any time.
# To clear Switch Order related stuff
# KMap.clear_switch_order
# * Examples of Script Condition Event Command
# There the @map_id would be the same as the current map.
# Script [ $game_party.chests_found[@map_id] >= 20 ]
# Script [ $game_party.traps_triggered[@map_id] < 6 ]
# Script [ KMap.pass_switch_order? ]
module KMap
CHESTS_SWITCH = 1
TRAPS_SWITCH = 2
SWITCH_ORDER_VAR = 1
MAP_SWITCH_ORDER = "Best Switch Order"
ALT_SWITCH_ORDER = "Alternate Switch Order"
SWITCH_ORDER = "Player's Switch Order"
FIXED_STEPS = true # Fix Number of Monster Encounter Steps?
DIVIDE_STEPS_BY = 1 # 1 : No Reduction, 2+ : Divide Steps by that value
# Options Order as :symbols : [ Chest, Trap, All ]
CLEAR_DATA_OPTIONS = [:chest, :trap, :all]
MIN_CHESTS_FOUND = {}
MIN_CHESTS_FOUND.default = 0 # For those maps you won't include here
MAX_TRAPS_FOUND = {}
MAX_TRAPS_FOUND.default = 0
# Example of Chests for Map #1: MIN_CHESTS_FOUND[1] = 20
# Example of Traps for Map #1: MIN_TRAPS_FOUND[1] = 5
class << self
def pass_chest_trap_test?(mid=$game_map.map_id)
return false if $game_party.chests_found[mid] < MIN_CHESTS_FOUND[mid]
$game_party.traps_triggered[mid] <= MIN_TRAPS_FOUND[mid]
end
def pass_switch_order?(mid=$game_map.map_id)
@map_switch_order == @switch_order
end
def select_order(n)
(n == 0 ? @map_switch_order : n == 1 ? @alt_switch_order : @switch_order)
end
def select_label(n)
(n == 0 ? MAP_SWITCH_ORDER : n == 1 ? ALT_SWITCH_ORDER : SWITCH_ORDER)
end
def clear_switch_order
@map_switch_order = []
@alt_switch_order = []
@switch_order = []
end
def retrieve_version
lines = File.readlines('Game.ini')
lines.each do |line|
value = line =~ /rgss\d/i
next if value == nil
return line.scan(/\d/)[0].to_i
end
end
attr_accessor :map_switch_order, :alt_switch_order
attr_reader :switch_order
end
MAKER_VERSION = retrieve_version
clear_switch_order
Manager = MAKER_VERSION == 1 ? Interpreter : Game_Interpreter
end
module SwitchOrder
def make_windows(y1, y2, y3)
@order_windows = [SwitchOrderWindow.new(y1, 0)]
@order_windows << SwitchOrderWindow.new(y2, 1)
@order_windows << SwitchOrderWindow.new(y3, 2)
end
def update_scene
Graphics.update
Input.update
update
end
def terminate
Graphics.freeze
@order_windows.each{|win| win.dispose }
end
end
class Game_System
alias :kyon_mdx_gm_sys_init :initialize
def initialize
kyon_mdx_gm_sys_init
@fixed_steps = KMap::FIXED_STEPS
@steps_reducer = KMap::DIVIDE_STEPS_BY
end
attr_accessor :fixed_steps, :steps_reducer
end
class Game_Party
alias :kyon_md_gm_party_init :initialize
def initialize
kyon_md_gm_party_init
@chests_found = {}
@chests_found.default = 0
@traps_triggered = {}
@traps_triggered.default = 0
end
def clear_data(data_sym, map_id=$game_map.map_id)
chest, traps, all = KMap::CLEAR_DATA_OPTIONS
@chests_found[map_id] = 0 if [all, chest].include?(data_sym)
@traps_triggered[map_id] = 0 if [all, traps].include?(data_sym)
end
attr_reader :chests_found, :traps_triggered
end
class Game_Player
def make_encounter_count
return if $game_map.map_id == 0
m = $game_system.steps_reducer
if $game_system.fixed_steps
@encounter_count = $game_map.encounter_step / m if @encounter_count == 0
else
n = $game_map.encounter_step / m
@encounter_count = rand(n) + rand(n) + 1
end
end
end
class KMap::Manager
alias :kyon_md_int_switches :command_121
alias :kyon_md_int_variables :command_122
def command_121
kyon_int_switches
cs = KMap::CHESTS_SWITCH
ts = KMap::TRAPS_SWITCH
if $game_switches[cs]
$game_switches[cs] = false
$game_party.chests_found[@map_id] += 1
end
if $game_switches[ts]
$game_switches[ts] = false
$game_party.traps_triggered[@map_id] += 1
end
return true
end
def command_122
sov = KMap::SWITCH_ORDER_VAR
if sov == @parameters[4] and $game_variables[sov] > 0
KMap.switch_order << $game_variables[sov]
$game_variables[sov] = 0
return true
end
kyon_md_int_variables
end
end
class SwitchOrderWindow < Window_Selectable
def initialize(wy, pos)
@switches = KMap.select_order(pos)
@label = KMap.select_label(pos)
@lh = KMap::MAKER_VERSION == 3 ? 24 : 32
@lj, h = KMap::MAKER_VERSION == 1 ? [28, 96] : [24, 88]
super(0, wy, Graphics.width, h)
create_contents
refresh
end
def refresh
bitmap = self.contents
bitmap.draw_text(0, 0, width - @lh, @lj, @label, 1)
lw = 0
@switches.size.times do |n|
label = @switches[n].to_s
lx = contents.text_size(label).width
bitmap.draw_text(lw, @lh, lx, @lj, label)
lw += lx + 8
end
end
end
Debug Scene Script
For XP
Code: # * KMapData - Switch Order Debug Menu XP
# Scripter : Kyonides Arkanthes
class SwitchOrderWindow
def create_contents
self.contents = Bitmap.new(width - 32, height - 32)
end
end
class SwitchOrderScene
def main
@order_windows = [SwitchOrderWindow.new(0, 0)]
@order_windows << SwitchOrderWindow.new(96, 1)
@order_windows << SwitchOrderWindow.new(192, 2)
Graphics.transition
until $scene != self
Graphics.update
Input.update
update
end
Graphics.freeze
@order_windows.each{|win| win.dispose }
end
def update
return unless Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
end
end
class Scene_Map
alias :kyon_md_scn_map_up :update
def update
kyon_md_scn_map_up
if Input.trigger?(Input::CTRL) and !$game_player.moving?
$game_system.se_play($data_system.decision_se)
$scene = SwitchOrderScene.new
end
end
end
Terms & Conditions
I don't know, I guess I might accept suggestions on this topic.
Free for non commercial games.
Give me a free copy of your completed game if you include at least 2 of my scripts!
RE: KMapData - kyonides - 07-05-2020
A Small Update
I revisited my script in order to let it incorporate an alternate switch map order as a second option, in case you wanna grant a consolation prize to the player for matching an easier or shorter set of switches instead of the main switch order...
Besides I finally included a debug menu for all Ruby based editions of the maker. It's script call would be:
$scene = SwitchOrderScene.new
I'm open to suggestions, constructive ones to be precise.
RE: KMapData - kyonides - 07-07-2020
Another Small Update
Your fellow shark has come back to bite you all!
Nah! I just returned to add 2 features to my KMapData script.
The first one is the automatic inclusion of the method to set the number of encounter steps. The latter would be a way to fix the number of steps to make it predictable on purpose. That's not all, folks!
You can also divide the number of encounter steps no matter if you're using the random or fixed number of steps!
I seriously think that method makes it interesting for a specific map could become harder by forcing you to get stuffed with all kind of potions and elixirs or by forcing you to go grinding somewhere else. Of course, a Pokemon like repel potion could also work there.
Let's say it forces the player to think tactically or even strategically.
Obviously, you can change the current mode or number of steps at any time. Just make some good use of the corresponding script calls.
|