GETTING PLACE VALUES OF VARIABLES.
Posts
Pages:
1
Is there any universal way to take a place value, including ones, tens, hundreds and thousands, of a variable and store that as another variable? I need to be able to use the same formula on any number.
And since I'm using VX, does anybody know of a script that will fix the shoddy variable math? I know GRS made one.
And since I'm using VX, does anybody know of a script that will fix the shoddy variable math? I know GRS made one.
I think it can be done with Modulus, which divides a number and gives you the remainder. It's really useful for finding place values.
Like CP said, Modulus Division (%) is like integer division (/) except it returns the remainder.
So
1234 / 10 = 123
1234 % 10 = 4
1234 / 100 = 12
1234 % 100 = 34
(1234 / 10) % 10 = 3
1234 % 2 = 0
1235 % 2 = 1
1236 % 2 = 0
I'll post that variable fix in a moment
Here:
# This is stupid. Fuck you Enterbrain.
class Game_Interpreter
alias command_122_bug command_122
def command_122
value = 0
case @params # Operand
when 0 # Constant
value = @params
when 1 # Variable
value = $game_variables[@params]
when 2 # Random
value = @params + rand(@params - @params + 1)
when 3 # Item
value = $game_party.item_number($data_items[@params])
when 4 # Actor
actor = $game_actors[@params]
if actor != nil
case @params
when 0 # Level
value = actor.level
when 1 # Experience
value = actor.exp
when 2 # HP
value = actor.hp
when 3 # MP
value = actor.mp
when 4 # Maximum HP
value = actor.maxhp
when 5 # Maximum MP
value = actor.maxmp
when 6 # Attack
value = actor.atk
when 7 # Defense
value = actor.def
when 8 # Spirit
value = actor.spi
when 9 # Agility
value = actor.agi
end
end
when 5 # Enemy
enemy = $game_troop.members[@params]
if enemy != nil
case @params
when 0 # HP
value = enemy.hp
when 1 # MP
value = enemy.mp
when 2 # Maximum HP
value = enemy.maxhp
when 3 # Maximum MP
value = enemy.maxmp
when 4 # Attack
value = enemy.atk
when 5 # Defense
value = enemy.def
when 6 # Spirit
value = enemy.spi
when 7 # Agility
value = enemy.agi
end
end
when 6 # Character
character = get_character(@params)
if character != nil
case @params
when 0 # x-coordinate
value = character.x
when 1 # y-coordinate
value = character.y
when 2 # direction
value = character.direction
when 3 # screen x-coordinate
value = character.screen_x
when 4 # screen y-coordinate
value = character.screen_y
end
end
when 7 # Other
case @params
when 0 # map ID
value = $game_map.map_id
when 1 # number of party members
value = $game_party.members.size
when 2 # gold
value = $game_party.gold
when 3 # steps
value = $game_party.steps
when 4 # play time
value = Graphics.frame_count / Graphics.frame_rate
when 5 # timer
value = $game_system.timer / Graphics.frame_rate
when 6 # save count
value = $game_system.save_count
end
end
for i in @params .. @params # Batch control
case @params # Operation
when 0 # Set
$game_variables = value
when 1 # Add
$game_variables += value
when 2 # Sub
$game_variables -= value
when 3 # Mul
$game_variables *= value
when 4 # Div
$game_variables /= value if value != 0
when 5 # Mod
$game_variables %= value if value != 0
end
if $game_variables > 99999999 # Maximum limit check
$game_variables = 99999999
end
if $game_variables < -99999999 # Minimum limit check
$game_variables = -99999999
end
end
$game_map.need_refresh = true
return true
end
end
Copy it into a new script and it should work on its own.
So
1234 / 10 = 123
1234 % 10 = 4
1234 / 100 = 12
1234 % 100 = 34
(1234 / 10) % 10 = 3
1234 % 2 = 0
1235 % 2 = 1
1236 % 2 = 0
I'll post that variable fix in a moment
Here:
# This is stupid. Fuck you Enterbrain.
class Game_Interpreter
alias command_122_bug command_122
def command_122
value = 0
case @params # Operand
when 0 # Constant
value = @params
when 1 # Variable
value = $game_variables[@params]
when 2 # Random
value = @params + rand(@params - @params + 1)
when 3 # Item
value = $game_party.item_number($data_items[@params])
when 4 # Actor
actor = $game_actors[@params]
if actor != nil
case @params
when 0 # Level
value = actor.level
when 1 # Experience
value = actor.exp
when 2 # HP
value = actor.hp
when 3 # MP
value = actor.mp
when 4 # Maximum HP
value = actor.maxhp
when 5 # Maximum MP
value = actor.maxmp
when 6 # Attack
value = actor.atk
when 7 # Defense
value = actor.def
when 8 # Spirit
value = actor.spi
when 9 # Agility
value = actor.agi
end
end
when 5 # Enemy
enemy = $game_troop.members[@params]
if enemy != nil
case @params
when 0 # HP
value = enemy.hp
when 1 # MP
value = enemy.mp
when 2 # Maximum HP
value = enemy.maxhp
when 3 # Maximum MP
value = enemy.maxmp
when 4 # Attack
value = enemy.atk
when 5 # Defense
value = enemy.def
when 6 # Spirit
value = enemy.spi
when 7 # Agility
value = enemy.agi
end
end
when 6 # Character
character = get_character(@params)
if character != nil
case @params
when 0 # x-coordinate
value = character.x
when 1 # y-coordinate
value = character.y
when 2 # direction
value = character.direction
when 3 # screen x-coordinate
value = character.screen_x
when 4 # screen y-coordinate
value = character.screen_y
end
end
when 7 # Other
case @params
when 0 # map ID
value = $game_map.map_id
when 1 # number of party members
value = $game_party.members.size
when 2 # gold
value = $game_party.gold
when 3 # steps
value = $game_party.steps
when 4 # play time
value = Graphics.frame_count / Graphics.frame_rate
when 5 # timer
value = $game_system.timer / Graphics.frame_rate
when 6 # save count
value = $game_system.save_count
end
end
for i in @params .. @params # Batch control
case @params # Operation
when 0 # Set
$game_variables = value
when 1 # Add
$game_variables += value
when 2 # Sub
$game_variables -= value
when 3 # Mul
$game_variables *= value
when 4 # Div
$game_variables /= value if value != 0
when 5 # Mod
$game_variables %= value if value != 0
end
if $game_variables > 99999999 # Maximum limit check
$game_variables = 99999999
end
if $game_variables < -99999999 # Minimum limit check
$game_variables = -99999999
end
end
$game_map.need_refresh = true
return true
end
end
Copy it into a new script and it should work on its own.
Ah, that should work, thanks. Just to clarify, is it (variable / place value) % place value, or (variable / place value) % 10?
There's a pattern. For thousands do:
var%10000
var/1000
for hundreds:
var%1000
var/100
for tens:
var%100
var/10
for ones:
var%10
(var/1)
;)
var%10000
var/1000
for hundreds:
var%1000
var/100
for tens:
var%100
var/10
for ones:
var%10
(var/1)
;)
It depends on how many digits you want. Think of dividing as shifting numbers to the right (and numbers on the right side just getting pushed off to oblivion) and modulus is grabbing digits right-to-left.
If you want to shift the digits right by two places, you'd divide by 100
1234 / 100 = 12
Shift by one? Divide by 10.
1234 / 10 = 123
If you want one digit, you modulous divide by 10.
1234 % 10 = 4
Two? 100
1234 % 100 = 34
So if you want the third digit and the third digit only, you'd shift the number right two places and get one digit. So you divide by 100 then modulus divide by 10.
(1234 / 100) % 10 = 2
Hopefully this clears it up
If you want to shift the digits right by two places, you'd divide by 100
1234 / 100 = 12
Shift by one? Divide by 10.
1234 / 10 = 123
If you want one digit, you modulous divide by 10.
1234 % 10 = 4
Two? 100
1234 % 100 = 34
So if you want the third digit and the third digit only, you'd shift the number right two places and get one digit. So you divide by 100 then modulus divide by 10.
(1234 / 100) % 10 = 2
Hopefully this clears it up
author=GreatRedSpirit link=topic=3384.msg67904#msg67904 date=1237999657Ah, so it's (var / place value) % 10. 1234 / 100 returns the 12, and 12 % 10 returns the 2. Dividing and modulus both split the number in two at a certain point, and while division gets the numbers on the left, modulus grabs the numbers on the right.
It depends on how many digits you want. Think of dividing as shifting numbers to the right (and numbers on the right side just getting pushed off to oblivion) and modulus is grabbing digits right-to-left.
If you want to shift the digits right by two places, you'd divide by 100
1234 / 100 = 12
Shift by one? Divide by 10.
1234 / 10 = 123
If you want one digit, you modulous divide by 10.
1234 % 10 = 4
Two? 100
1234 % 100 = 34
So if you want the third digit and the third digit only, you'd shift the number right two places and get one digit. So you divide by 100 then modulus divide by 10.
(1234 / 100) % 10 = 2
Hopefully this clears it up
I think I understand this well enough. Thanks for the help.
Pages:
1

















