Jump to content

research Pokemon Super Mystery Dungeon And PMD:GTI Research And Utilities


Recommended Posts

So, the PSMD dump is out, but as expected they dumped it encrypted, because it works better on some flashcarts. So yeah... :/

Anyways, Idk if SciresM is going to answer my post + pm, but in the meantime, I stumbled on this a while ago on the forums :

http://projectpokemon.org/forums/showthread.php?43617-Gates-to-Infinity-From-IMG-file-to-PNG

Which would probably come in handy.

I've also been taking apart the game text, but the annoying thing about those is that, they're stored using unique hashes to refer to them.. Oddly enough, those appear to be language independent since they're placed directly into the script files to refer to particular strings. But the thing is, Idk how those hashes are computed, or if they're just GUID, and not actual hashes..

But I have very little experience with custom hash maps, so its a bit hard for me to figure this out. If anyone with experience on those would want to take a look it would be appreciated!

Here are my notes on the format:

https://dl.dropboxusercontent.com/u/13343993/my_pmd_research_files/PMD_GTI/FileFormats/string_database.txt

Those files are found under the /message/ directory, they all have the .bin extension, as they're just SIR0 containers meant to be loaded in memory directly.

They're loaded in scripts by filenames via the MENU:LoadMenuTextPool function, and then they're referred to by number in a variety of function. The decompiler doesn't seem to differentiate between what's a GUID/hash or not, so the values are represented as very large, signed, decimal numbers and are easy to spot really.

Link to comment
Share on other sites

Hi there. I see you noticed my post about IMG format. So I thought that was the good time to give you some more research I made on GTI.

/pokemon/ contains data about Pokémon. It contains 7 files which are : experience.bin, experience.ent, grade.bin, grade.ent, pokemon_data_info.bin, type_data_info.bin and waza_data_info.bin. ENT files contains pointers for their namesake.

experience.bin is the experience table for each level of each Pokémon. There are 100 levels per Pokémon (quite obvious, I know...). Each Pokémon table is 0x4C0 bytes long, with an empty padding of 16 bytes (only 0x00). There are some dummed entries, which contains nonsense experience table. I don't know what to think about them.

PokemonEntry
[
LevelEntry												Starts at level 0. 100 entries per Pokémon.
[
	0x00		experience			4			uint32			Amount of maximum experience in the current level (Little Endian). Add 1 to get the experience needed to level up.
	0x04		addedhp				1			uint8			Added HP when leveling up.
	0x05		addedatk			1			uint8			Added Attack when leveling up.
	0x06		addeddef			1			uint8			Added Defense when leveling up.
	0x07		addedspeatk			1			uint8			Added Special Attack when leveling up.
	0x08		addedspedef			1			uint8			Added Special Defense when leveling up.
	0x09		lvlpadding			3			-			Padding between level. Always 0x00.
]
...
0x4B0			pkmpadding			16			-			Padding between Pokémon. Always 0x00.
]
...

experience.ent contains pointers to each Pokémon experience table. Each pointer is 4 bytes long.

Don't know what is grade.bin about, but according to grade.ent, there's only 3 entries. First one is 0xA0 bytes long, second one go straight to the end. The last value in grade.ent equals the length of grade.bin.

pokemon_data_info.bin contains Pokémon informations (wouhou, that's obvious). It has a first empty entry of 0xE0 bytes, so we could think each Pokémon entry is that long. I didn't understand well the structure but I know, thanks to common.bin in /message/ that the Pokémon order is the following (with some unused one between) :

Pikachu
Raichu
Starmie
Eevee
Vaporeon
Jolteon
Flareon
Chinchou
Pichu
Marill
Azumarill
Sunkern
Wooper
Quagsire
Espeon
Umbreon
Dunsparce
Swinub
Piloswine
Lugia
Ho-Oh
Wingull
Pelipper
Azurill
Kecleon
Bagon
Shelgon
Salamence
Cranidos
Rampardos
Glameow
Purugly
Croagunk
Toxicroak
Leafeon
Glaceon
Mamoswine
Victini
Snivy
Servine
Serperior
Tepig
Pignite
Emboar
Oshawott
Dewott
Samurott
Patrat
Watchog
Lillipup
Herdier
Stoutland
Pansage
Simisage
Pansear
Simisear
Panpour
Simipour
Munna
Musharna
Blitzle
Zebstrika
Roggenrola
Boldore
Gigalith
Woobat
Swoobat
Drilbur
Excadrill
Audino
Timburr
Gurdurr
Conkeldurr
Tympole
Palpitoad
Seismitoad
Sewaddle
Swadloon
Leavanny
Venipede
Whirlipede
Scolipede
Cottonee
Whimsicott
Petilil
Lilligant
Sandile
Krokorok
Krookodile
Dwebble
Crustle
Scraggy
Scrafty
Yamask
Cofagrigus
Tirtouga
Carracosta
Archen
Archeops
Trubbish
Garbodor
Zorua
Zoroark
Minccino
Cinccino
Gothita
Gothorita
Gothitelle
Ducklett
Swanna
Emolga
Foongus
Amoonguss
Joltik
Galvantula
Klink
Klang
Klinklang
Litwick
Lampent
Chandelure
Axew
Fraxure
Haxorus
Cubchoo
Beartic
Cryogonal
Mienfoo
Mienshao
Druddigon
Golett
Golurk
Pawniard
Bisharp
Rufflet
Braviary
Vullaby
Mandibuzz
Deino
Zweilous
Hydreigon
Larvesta
Volcarona
Cobalion
Terrakion
Virizion
Tornadus
Thundurus
Reshiram
Zekrom
Landorus
Kyurem
Keldeo
Meloetta
Meloetta
Kyurem
Kyurem
Pikachu

type_data_info.bin contains some Types informations, but I don't know how it works.

waza_data_info.bin contains Moves data. There's a first empty entry 0x1E bytes, so again, I could confirm that each one is that long. Didn't took the time to study those, but here's the supposed list of Moves to use (it may contain some French names because that was quickly translate) :

Pound
Karate Chop
Double Slap
Comet Punch
Mega Punch
Pay Day
Fire Punch
Poinglace
Thunder Punch
Scratch
Vice Grip
Guillotine
Razor Wind
Swords Dance
Cut
Gust
Wing Attack
Whirlwind
Flying
Bind
Slam
Vine Whip
Stomp
Double Kick
Mega Kick
Jump Kick
Rolling Kick
Sand Attack
Headbutt
Horn Attack
Fury Attack
Horn Drill
Tackle
Body Slam
Wrap
Take Down
Thrash
Double-Edge
Tail Whip
Poison Sting
Twineedle
Pin Missile
Leer
Bite
Growl
Roar
Sing
Supersonic
Sonic Boom
Disable
Acid
Ember
Lance-Flamme
Mist
Water Gun
Hydro Pump
Surf
Ice Beam
Blizzard
Psybeam
Bubble Beam
Aurora Beam
Hyper Beam
Peck
Drill Peck
Submission
Low Kick
Counter
Seismic Toss
Strength
Absorb
Mega Drain
Leech Seed
Growth
Razor Leaf
Solar Beam
Poison Powder
Stun Spore
Sleep Powder
Petal Dance
String Shot
Dragon Rage
Danseflamme
Thunder Shock
Thunderbolt
Thunder Wave
Thunder
Rock Throw
Earthquake
Fissure
Dig
Toxic
Confusion
Psychic
Hypnosis
Meditate
Agility
Quick Attack
Rage
Teleport
Dark
Mimic
Screech
Double Team
Recover
Harden
Minimize
Smokescreen
Confuse Ray
Withdraw
Defense Curl
Barrier
Light Screen
Haze
Reflect
Focus Energy
Bide
Metronome
Mirror Move
Self-Destruct
Bomb'Ruf
Lick
Smog
Sludge
Bone Club
Fire Blast
Waterfall
Clamp
Swift
Skull Bash
Spike Cannon
Constrict
Amnesia
Kinesis
Soft-Boiled
High Jump Kick
Intimidate
Dream Eater
Poison Gas
Block
Leech Life
Lovely Kiss
Pique
Transform
Bubble
Dizzy Punch
Spore
Flash
Psywave
Splash
Acid Armor
Crabhammer
Explosion
Fury Swipes
Bonemerang
Rest
Rock Slide
Hyper Fang
Sharpen
Adaptation
Tri Attack
Super Fang
Slash
Substitute
Struggle
Sketch
Triple Kick
Thief
Spider Web
Mind Reader
Nightmare
Flame Wheel
Snore
Curse
Flail
Adaptation
Aeroblast
Cotton Spore
Reversal
Spite
Powder Snow
Protect
Mach Punch
Scary Face
Feint Attack
Sweet Kiss
Belly Drum
Sludge Bomb
Mud-Slap
Octazooka
Spikes
Zap Cannon
Foresight
Prlvt Destin
Perish Song
Icy Wind
Detect
Bone Rush
Lock-On
Outrage
Tempêtesable
Giga Drain
Endure
Charm
Rollout
False Swipe
Swagger
Milk Drink
Spark
Fury Cutter
Steel Wing
Mean Look
Attract
Sleep Talk
Heal Bell
Return
Present
Frustration
Safeguard
Pain Split
Sacred Fire
Magnitude
Dynamic Punch
Megahorn
Dragon Breath
Baton Pass
Encore
Pursuit
Rapid Spin
Sweet Scent
Iron Tail
Metal Claw
Vital Throw
Morning Sun
Synthesis
Moonlight
Puis. Cachée
Cross Chop
Twister
Rain Dance
Sunny Day
Crunch
Mirror Coat
Psych Up
Vit. Extrême
Pouv. Antique
Shadow Ball
Future Sight
Rock Smash
Whirlpool
Beat Up
Fake Out
Uproar
Stockpile
Spit Up
Swallow
Heat Wave
Hail
Torment
Flatter
Will-O-Wisp
Memento
Facade
Focus Punch
Smelling Salts
Follow Me
Nature Power
Tackle
Taunt
Helping Hand
Trick
Role Play
VSu
Assist
Ingrain
Superpower
Magic Coat
Recycle
Revenge
Brick Break
Yawn
Knock Off
Endeavor
Eruption
Skill Swap
Imprison
Refresh
Grudge
Snatch
Secret Power
Dive
Arm Thrust
Camouflage
Tail Glow
Luster Purge
Mist Ball
Feather Dance
Teeter Dance
Blaze Kick
Mud Sport
Ice Ball
Needle Arm
Slack Off
Hyper Voice
Crochetvenin
Éclategriffe
Blast Burn
Hydro Cannon
Meteor Mash
Astonish
Weather Ball
Aromathérapi
Fake Tears
Air Cutter
Overheat
Odor Sleuth
Rock Tomb
Silver Wind
Metal Sound
Grass Whistle
Tickle
Cosmic Power
Water Spout
Signal Beam
Shadow Punch
Extrasensory
Sky Dizzy Punch
Sand Tomb
Sheer Cold
Muddy Water
Bullet Seed
Aerial Ace
Icicle Spear
Iron Defense
Block
Howl
Dragon Claw
Frenzy Plant
Bulk Up
Bounce
Mud Shot
Poison Tail
Covet
Volt Tackle
Feuillemagik
Water Sport
Calm Mind
Leaf Blade
Dragon Dance
Rock Blast
Shock Wave
Water Pulse
Doom Desire
Psycho Boost
Roost
Gravity
Ril Miracle
Wake-Up Slap
Hammer Arm
Gyro Ball
VSu Recover
Brine
Natural Gift
Feint
Pluck
Tailwind
Acupressure
Metal Burst
U-turn
Close Combat
Payback
Assurance
Embargo
Fling
Psycho Shift
Trump Card
Heal Block
Wring Out
Power Trick
Gastro Acid
Lucky Chant
Me First
Copycat
Power Swap
Guard Swap
Punishment
Dernierecour
Worry Seed
Sucker Punch
Toxic Spikes
Heart Swap
Aqua Ring
Magnet Rise
Flare Blitz
Strength Palm
Aura Sphere
Rock Polish
Poison Jab
Dark Pulse
Night Slash
Aqua Tail
Seed Bomb
Air Slash
X-Scissor
Bug Buzz
Dragon Pulse
Dragon Rush
Power Gem
Drain Punch
Vacuum Wave
Focus Blast
Energy Ball
Brave Bird
Earth Power
Switcheroo
Giga Impact
Nasty Plot
Bullet Punch
Avalanche
Ice Shard
Shadow Claw
Thunder Fang
Ice Fang
Fire Fang
Shadow Sneak
Mud Bomb
Psycho Cut
Zen Headbutt
Mirror Shot
Flash Cannon
Rock Climb
Defog
Trick Room
Dragonair Meteor
Discharge
Lava Plume
Tempêteverte
Power Whip
Rock Wrecker
Cross Poison
Gunk Shot
Iron Head
Magnet Bomb
Stone Edge
Captivate
Stealth Rock
NSud Herbe
Chatter
Judgment
Bug Bite
Tackle Beam
Wood Hammer
Aqua Jet
Attack Order
Defend Order
Heal Order
Head Smash
Double Hit
Roar of Time
Spacial Rend
Lunar Dance
Crush Grip
Magma Storm
Dark Void
Seed Flare
Ominous Wind
Shadow Strength
Hone Claws
Wide Guard
Guard Split
Power Split
Wonder Room
Psyshock
Venoshock
Autotomize
PoudreFureur
Telekinesis
Magic Room
Smack Down
Storm Throw
Flame Burst
Sludge Wave
Quiver Dance
Heavy Slam
Synchronoise
Electro Ball
Soak
Flame Tackle
Coil
Low Sweep
Acid Spray
Foul Play
Simple Beam
Entrainment
After You
Round
Echoed Voice
Chip Away
Clear Smog
Stored Power
Quick Guard
Ally Switch
Scald
Shell Smash
Heal Pulse
Hex
Sky Drop
Shift Gear
Circle Throw
Incinerate
Quash
Acrobatics
Reflect Type
Retaliate
Final Gambit
Bestow
Inferno
Water Pledge
Fire Pledge
Grass Pledge
Volt Switch
Struggle Bug
Bulldoze
Frost Breath
Dragon Tail
Work Up
Electroweb
Wild Tackle
Drill Run
Dual Chop
Crèvecœur
Horn Leech
Sacred Sword
Razor Shell
Heat Crash
Leaf Tornado
Steamroller
Cotton Guard
Night Daze
Psystrike
Tail Slap
Hurricane
Head Tackle
Gear Grind
Searing Shot
Techno Blast
ChantAntique
Secret Sword
ÈreGlaciaire
ChargeFoudre
Blue Flare
Fiery Dance
Freeze Shock
Ice Burn
Snarl
Icicle Crash
CoupVictoire
Fusion Flare
Fusion Bolt
Weather Ball
Weather Ball
Weather Ball
Weather Ball
Dig
Razor Wind
Focus Punch
Pique
Solar Beam
Flying
Dive
Bounce
Skull Bash
Curse
Snore
Sleep Talk
Bide
Revenge
Avalanche
Fusion Flare
Fusion Bolt
Sky Drop
#N/A
#N/A
#N/A
Future Sight
Attaque
#N/A
#N/A
#N/A
#N/A
Slash
Dragon Claw
Dragon Tail
Dragon Breath
Dragon Breath
Flying
Ice Beam
Ice Beam
Glaciate
Glaciate
Flying
Blizzard
Thunder
Fusion Bolt
Bolt Strike
Bolt Strike
Lance-Flamme
Lance-Flamme
Fusion Flare
Fusion Flare
Blue Flare
Blue Flare
Freeze Shock
Freeze Shock
Ice Burn
Ice Burn
Pouv. Antique
Extrasensory
Light Screen
Reflect
Dragon Rush
Aeroblast
Aeroblast
Hydro Pump
Hydro Pump
Brave Bird
Lance-Flamme
Lance-Flamme
Sacred Fire
Sacred Fire
Flying
Struggle
Struggle
Slash
Dragon Claw
Flying
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED

At the root of the RomFS, there's a file called item_data.bin. That one contains Items data. Each entry looks to be 0x1C bytes long, with an strange ending one of 0x0C bytes. Don't know the whole structure, but for each entry I know that :

  • 0x00 (uint16) seems to be the "category" of item. Throwable, wears, prices, apples, seeds, donuts, devices, vitamins, secrets, orbs, evolve items, keys, lottery tickets, money, treasures, TM's, gifts, rewards (material for Pokémon Paradise buildings), traps and quest items. Maybe not that precise...
  • 0x02 (uint16) is their Price in Poké or Gold Ingot.

You can find their order by refering to their names in common.bin text file in your /message_ln/ folder. There's many UNUSED and some dev-only items. TM's don't have any number, so refer to their corresponding move name to know which item it is. You can seek for Stick as the first item, followed by Iron Thorn and Silver Spike.

Good luck guys, and thanks for working on those games.

EDIT: Just remenber that I made a tool to view the experience table (I may have done some mistakes but it works). Here it is:

GTI_Experience_Viewer.zip

My code is shitty so I don't think that's a good idea to share it, but you can ask for.

GTI_Experience_Viewer.zip

Edited by Megadrifter
Add a old tool to view experience table.
Link to comment
Share on other sites

Hi there. I see you noticed my post about IMG format. So I thought that was the good time to give you some more research I made on GTI.

I'd have posted the link to your post sooner if I knew you'd come and post here :P

But seriously, that really helpful! thanks !

/pokemon/ contains data about Pokémon. It contains 7 files which are : experience.bin, experience.ent, grade.bin, grade.ent, pokemon_data_info.bin, type_data_info.bin and waza_data_info.bin. ENT files contains pointers for their namesake.

experience.bin is the experience table for each level of each Pokémon. There are 100 levels per Pokémon (quite obvious, I know...). Each Pokémon table is 0x4C0 bytes long, with an empty padding of 16 bytes (only 0x00). There are some dummed entries, which contains nonsense experience table. I don't know what to think about them.

PokemonEntry
[
LevelEntry												Starts at level 0. 100 entries per Pokémon.
[
	0x00		experience			4			uint32			Amount of maximum experience in the current level (Little Endian). Add 1 to get the experience needed to level up.
	0x04		addedhp				1			uint8			Added HP when leveling up.
	0x05		addedatk			1			uint8			Added Attack when leveling up.
	0x06		addeddef			1			uint8			Added Defense when leveling up.
	0x07		addedspeatk			1			uint8			Added Special Attack when leveling up.
	0x08		addedspedef			1			uint8			Added Special Defense when leveling up.
	0x09		lvlpadding			3			-			Padding between level. Always 0x00.
]
...
0x4B0			pkmpadding			16			-			Padding between Pokémon. Always 0x00.
]
...

experience.ent contains pointers to each Pokémon experience table. Each pointer is 4 bytes long.

That looks like its very similar to how it was in Explorers of Sky!

Though, the data was encoded/shortened in EoS.

Don't know what is grade.bin about, but according to grade.ent, there's only 3 entries. First one is 0xA0 bytes long, second one go straight to the end. The last value in grade.ent equals the length of grade.bin.

pokemon_data_info.bin contains Pokémon informations (wouhou, that's obvious). It has a first empty entry of 0xE0 bytes, so we could think each Pokémon entry is that long. I didn't understand well the structure but I know, thanks to common.bin in /message/ that the Pokémon order is the following (with some unused one between) :

Pikachu
Raichu
Starmie
Eevee
Vaporeon
Jolteon
Flareon
Chinchou
Pichu
Marill
Azumarill
Sunkern
Wooper
Quagsire
Espeon
Umbreon
Dunsparce
Swinub
Piloswine
Lugia
Ho-Oh
Wingull
Pelipper
Azurill
Kecleon
Bagon
Shelgon
Salamence
Cranidos
Rampardos
Glameow
Purugly
Croagunk
Toxicroak
Leafeon
Glaceon
Mamoswine
Victini
Snivy
Servine
Serperior
Tepig
Pignite
Emboar
Oshawott
Dewott
Samurott
Patrat
Watchog
Lillipup
Herdier
Stoutland
Pansage
Simisage
Pansear
Simisear
Panpour
Simipour
Munna
Musharna
Blitzle
Zebstrika
Roggenrola
Boldore
Gigalith
Woobat
Swoobat
Drilbur
Excadrill
Audino
Timburr
Gurdurr
Conkeldurr
Tympole
Palpitoad
Seismitoad
Sewaddle
Swadloon
Leavanny
Venipede
Whirlipede
Scolipede
Cottonee
Whimsicott
Petilil
Lilligant
Sandile
Krokorok
Krookodile
Dwebble
Crustle
Scraggy
Scrafty
Yamask
Cofagrigus
Tirtouga
Carracosta
Archen
Archeops
Trubbish
Garbodor
Zorua
Zoroark
Minccino
Cinccino
Gothita
Gothorita
Gothitelle
Ducklett
Swanna
Emolga
Foongus
Amoonguss
Joltik
Galvantula
Klink
Klang
Klinklang
Litwick
Lampent
Chandelure
Axew
Fraxure
Haxorus
Cubchoo
Beartic
Cryogonal
Mienfoo
Mienshao
Druddigon
Golett
Golurk
Pawniard
Bisharp
Rufflet
Braviary
Vullaby
Mandibuzz
Deino
Zweilous
Hydreigon
Larvesta
Volcarona
Cobalion
Terrakion
Virizion
Tornadus
Thundurus
Reshiram
Zekrom
Landorus
Kyurem
Keldeo
Meloetta
Meloetta
Kyurem
Kyurem
Pikachu

Nice! I've been looking for where they were storing the pokemon names for a while!

Also, its possible that grade.bin is for the paradise ranks. There's a lot of engrish used in the game files xD (The scripts are particularly filled with engrish xD)

type_data_info.bin contains some Types informations, but I don't know how it works.

waza_data_info.bin contains Moves data. There's a first empty entry 0x1E bytes, so again, I could confirm that each one is that long. Didn't took the time to study those, but here's the supposed list of Moves to use (it may contain some French names because that was quickly translate) :

Pound
Karate Chop
Double Slap
Comet Punch
Mega Punch
Pay Day
Fire Punch
Poinglace
Thunder Punch
Scratch
Vice Grip
Guillotine
Razor Wind
Swords Dance
Cut
Gust
Wing Attack
Whirlwind
Flying
Bind
Slam
Vine Whip
Stomp
Double Kick
Mega Kick
Jump Kick
Rolling Kick
Sand Attack
Headbutt
Horn Attack
Fury Attack
Horn Drill
Tackle
Body Slam
Wrap
Take Down
Thrash
Double-Edge
Tail Whip
Poison Sting
Twineedle
Pin Missile
Leer
Bite
Growl
Roar
Sing
Supersonic
Sonic Boom
Disable
Acid
Ember
Lance-Flamme
Mist
Water Gun
Hydro Pump
Surf
Ice Beam
Blizzard
Psybeam
Bubble Beam
Aurora Beam
Hyper Beam
Peck
Drill Peck
Submission
Low Kick
Counter
Seismic Toss
Strength
Absorb
Mega Drain
Leech Seed
Growth
Razor Leaf
Solar Beam
Poison Powder
Stun Spore
Sleep Powder
Petal Dance
String Shot
Dragon Rage
Danseflamme
Thunder Shock
Thunderbolt
Thunder Wave
Thunder
Rock Throw
Earthquake
Fissure
Dig
Toxic
Confusion
Psychic
Hypnosis
Meditate
Agility
Quick Attack
Rage
Teleport
Dark
Mimic
Screech
Double Team
Recover
Harden
Minimize
Smokescreen
Confuse Ray
Withdraw
Defense Curl
Barrier
Light Screen
Haze
Reflect
Focus Energy
Bide
Metronome
Mirror Move
Self-Destruct
Bomb'Ruf
Lick
Smog
Sludge
Bone Club
Fire Blast
Waterfall
Clamp
Swift
Skull Bash
Spike Cannon
Constrict
Amnesia
Kinesis
Soft-Boiled
High Jump Kick
Intimidate
Dream Eater
Poison Gas
Block
Leech Life
Lovely Kiss
Pique
Transform
Bubble
Dizzy Punch
Spore
Flash
Psywave
Splash
Acid Armor
Crabhammer
Explosion
Fury Swipes
Bonemerang
Rest
Rock Slide
Hyper Fang
Sharpen
Adaptation
Tri Attack
Super Fang
Slash
Substitute
Struggle
Sketch
Triple Kick
Thief
Spider Web
Mind Reader
Nightmare
Flame Wheel
Snore
Curse
Flail
Adaptation
Aeroblast
Cotton Spore
Reversal
Spite
Powder Snow
Protect
Mach Punch
Scary Face
Feint Attack
Sweet Kiss
Belly Drum
Sludge Bomb
Mud-Slap
Octazooka
Spikes
Zap Cannon
Foresight
Prlvt Destin
Perish Song
Icy Wind
Detect
Bone Rush
Lock-On
Outrage
Tempêtesable
Giga Drain
Endure
Charm
Rollout
False Swipe
Swagger
Milk Drink
Spark
Fury Cutter
Steel Wing
Mean Look
Attract
Sleep Talk
Heal Bell
Return
Present
Frustration
Safeguard
Pain Split
Sacred Fire
Magnitude
Dynamic Punch
Megahorn
Dragon Breath
Baton Pass
Encore
Pursuit
Rapid Spin
Sweet Scent
Iron Tail
Metal Claw
Vital Throw
Morning Sun
Synthesis
Moonlight
Puis. Cachée
Cross Chop
Twister
Rain Dance
Sunny Day
Crunch
Mirror Coat
Psych Up
Vit. Extrême
Pouv. Antique
Shadow Ball
Future Sight
Rock Smash
Whirlpool
Beat Up
Fake Out
Uproar
Stockpile
Spit Up
Swallow
Heat Wave
Hail
Torment
Flatter
Will-O-Wisp
Memento
Facade
Focus Punch
Smelling Salts
Follow Me
Nature Power
Tackle
Taunt
Helping Hand
Trick
Role Play
VSu
Assist
Ingrain
Superpower
Magic Coat
Recycle
Revenge
Brick Break
Yawn
Knock Off
Endeavor
Eruption
Skill Swap
Imprison
Refresh
Grudge
Snatch
Secret Power
Dive
Arm Thrust
Camouflage
Tail Glow
Luster Purge
Mist Ball
Feather Dance
Teeter Dance
Blaze Kick
Mud Sport
Ice Ball
Needle Arm
Slack Off
Hyper Voice
Crochetvenin
Éclategriffe
Blast Burn
Hydro Cannon
Meteor Mash
Astonish
Weather Ball
Aromathérapi
Fake Tears
Air Cutter
Overheat
Odor Sleuth
Rock Tomb
Silver Wind
Metal Sound
Grass Whistle
Tickle
Cosmic Power
Water Spout
Signal Beam
Shadow Punch
Extrasensory
Sky Dizzy Punch
Sand Tomb
Sheer Cold
Muddy Water
Bullet Seed
Aerial Ace
Icicle Spear
Iron Defense
Block
Howl
Dragon Claw
Frenzy Plant
Bulk Up
Bounce
Mud Shot
Poison Tail
Covet
Volt Tackle
Feuillemagik
Water Sport
Calm Mind
Leaf Blade
Dragon Dance
Rock Blast
Shock Wave
Water Pulse
Doom Desire
Psycho Boost
Roost
Gravity
Ril Miracle
Wake-Up Slap
Hammer Arm
Gyro Ball
VSu Recover
Brine
Natural Gift
Feint
Pluck
Tailwind
Acupressure
Metal Burst
U-turn
Close Combat
Payback
Assurance
Embargo
Fling
Psycho Shift
Trump Card
Heal Block
Wring Out
Power Trick
Gastro Acid
Lucky Chant
Me First
Copycat
Power Swap
Guard Swap
Punishment
Dernierecour
Worry Seed
Sucker Punch
Toxic Spikes
Heart Swap
Aqua Ring
Magnet Rise
Flare Blitz
Strength Palm
Aura Sphere
Rock Polish
Poison Jab
Dark Pulse
Night Slash
Aqua Tail
Seed Bomb
Air Slash
X-Scissor
Bug Buzz
Dragon Pulse
Dragon Rush
Power Gem
Drain Punch
Vacuum Wave
Focus Blast
Energy Ball
Brave Bird
Earth Power
Switcheroo
Giga Impact
Nasty Plot
Bullet Punch
Avalanche
Ice Shard
Shadow Claw
Thunder Fang
Ice Fang
Fire Fang
Shadow Sneak
Mud Bomb
Psycho Cut
Zen Headbutt
Mirror Shot
Flash Cannon
Rock Climb
Defog
Trick Room
Dragonair Meteor
Discharge
Lava Plume
Tempêteverte
Power Whip
Rock Wrecker
Cross Poison
Gunk Shot
Iron Head
Magnet Bomb
Stone Edge
Captivate
Stealth Rock
NSud Herbe
Chatter
Judgment
Bug Bite
Tackle Beam
Wood Hammer
Aqua Jet
Attack Order
Defend Order
Heal Order
Head Smash
Double Hit
Roar of Time
Spacial Rend
Lunar Dance
Crush Grip
Magma Storm
Dark Void
Seed Flare
Ominous Wind
Shadow Strength
Hone Claws
Wide Guard
Guard Split
Power Split
Wonder Room
Psyshock
Venoshock
Autotomize
PoudreFureur
Telekinesis
Magic Room
Smack Down
Storm Throw
Flame Burst
Sludge Wave
Quiver Dance
Heavy Slam
Synchronoise
Electro Ball
Soak
Flame Tackle
Coil
Low Sweep
Acid Spray
Foul Play
Simple Beam
Entrainment
After You
Round
Echoed Voice
Chip Away
Clear Smog
Stored Power
Quick Guard
Ally Switch
Scald
Shell Smash
Heal Pulse
Hex
Sky Drop
Shift Gear
Circle Throw
Incinerate
Quash
Acrobatics
Reflect Type
Retaliate
Final Gambit
Bestow
Inferno
Water Pledge
Fire Pledge
Grass Pledge
Volt Switch
Struggle Bug
Bulldoze
Frost Breath
Dragon Tail
Work Up
Electroweb
Wild Tackle
Drill Run
Dual Chop
Crèvecœur
Horn Leech
Sacred Sword
Razor Shell
Heat Crash
Leaf Tornado
Steamroller
Cotton Guard
Night Daze
Psystrike
Tail Slap
Hurricane
Head Tackle
Gear Grind
Searing Shot
Techno Blast
ChantAntique
Secret Sword
ÈreGlaciaire
ChargeFoudre
Blue Flare
Fiery Dance
Freeze Shock
Ice Burn
Snarl
Icicle Crash
CoupVictoire
Fusion Flare
Fusion Bolt
Weather Ball
Weather Ball
Weather Ball
Weather Ball
Dig
Razor Wind
Focus Punch
Pique
Solar Beam
Flying
Dive
Bounce
Skull Bash
Curse
Snore
Sleep Talk
Bide
Revenge
Avalanche
Fusion Flare
Fusion Bolt
Sky Drop
#N/A
#N/A
#N/A
Future Sight
Attaque
#N/A
#N/A
#N/A
#N/A
Slash
Dragon Claw
Dragon Tail
Dragon Breath
Dragon Breath
Flying
Ice Beam
Ice Beam
Glaciate
Glaciate
Flying
Blizzard
Thunder
Fusion Bolt
Bolt Strike
Bolt Strike
Lance-Flamme
Lance-Flamme
Fusion Flare
Fusion Flare
Blue Flare
Blue Flare
Freeze Shock
Freeze Shock
Ice Burn
Ice Burn
Pouv. Antique
Extrasensory
Light Screen
Reflect
Dragon Rush
Aeroblast
Aeroblast
Hydro Pump
Hydro Pump
Brave Bird
Lance-Flamme
Lance-Flamme
Sacred Fire
Sacred Fire
Flying
Struggle
Struggle
Slash
Dragon Claw
Flying
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED
UNUSED

That sounds also very similar to EoS's waza_p.bin file. And its all good, French is my first language so I didn't have too much issues, even though some names are just completely different in French. (I usually play the games in english though)

At the root of the RomFS, there's a file called item_data.bin. That one contains Items data. Each entry looks to be 0x1C bytes long, with an strange ending one of 0x0C bytes. Don't know the whole structure, but for each entry I know that :

  • 0x00 (uint16) seems to be the "category" of item. Throwable, wears, prices, apples, seeds, donuts, devices, vitamins, secrets, orbs, evolve items, keys, lottery tickets, money, treasures, TM's, gifts, rewards (material for Pokémon Paradise buildings), traps and quest items. Maybe not that precise...
  • 0x02 (uint16) is their Price in Poké or Gold Ingot.

You can find their order by refering to their names in common.bin text file in your /message_ln/ folder. There's many UNUSED and some dev-only items. TM's don't have any number, so refer to their corresponding move name to know which item it is. You can seek for Stick as the first item, followed by Iron Thorn and Silver Spike.

Good luck guys, and thanks for working on those games.

EDIT: Just remenber that I made a tool to view the experience table (I may have done some mistakes but it works). Here it is: [ATTACH]12591[/ATTACH]

My code is shitty so I don't think that's a good idea to share it, but you can ask for.

Alright.

And my code is terrible too, but I post it anyways xD You never know, it might be helpful to some people.

Link to comment
Share on other sites

Right, I should probably pay attention to this :)

Anyway, .img is the same as in previous games, FARC struct is update (no more file name tables :( ) so my extractor doesn't work for all files. A hack got it working, but the files aren't in any meaningful order...needs some work.

I still need to update CGSE before I can seriously take a look at this stuff (and I'm kind of swamped with work...it might be a week or two), but in the mean-time:

ArLwjSR.jpg

eNlsXYR.png

dOrol4D.png

BZAuvs7.png

w9f8j17.png

lcqE7sP.png

F6pvJoe.png

ml6GoZc.png

bZEEs6B.png

ZCtaubs.png

E4enn4d.png

d4Pa6yy.png

A0VyVAc.png

Link to comment
Share on other sites

Right, I should probably pay attention to this :)

Anyway, .img is the same as in previous games, FARC struct is update (no more file name tables :( ) so my extractor doesn't work for all files. A hack got it working, but the files aren't in any meaningful order...needs some work.

Well, that's good to hear that some formats are similar! :D

But, what about the rest, is it still mostly the same?

I don't think the filenames were part of the FARC format though. They were in a SIR0 container on their own.

It probably just means that they're using something different than filenames to refer to game resources now. Possibly by GUIDs?

I mean, considering the game text is stored in text databases and each entries are referred to by GUID.

Its funny though, because EMD still has that SIR0 with the filenames. They might have changed things a bit..

But, I don't have the PSMD game files yet, so I can't take a look.. (No decrypted rom anywhere to be found.. :(

I'm considering getting my 3ds hard modded with a microSD adapter, to make a forced firmware downgrade..)

I still need to update CGSE before I can seriously take a look at this stuff (and I'm kind of swamped with work...it might be a week or two), but in the mean-time:

ArLwjSR.jpg

eNlsXYR.png

dOrol4D.png

BZAuvs7.png

w9f8j17.png

lcqE7sP.png

F6pvJoe.png

ml6GoZc.png

bZEEs6B.png

ZCtaubs.png

E4enn4d.png

d4Pa6yy.png

A0VyVAc.png

That's all good.

And, that brings up something I completely forgot about ^^;

I'd better add a notice telling people to hide PSMD spoilers in this thread!

Link to comment
Share on other sites

I'm considering getting my 3ds hard modded with a microSD adapter, to make a forced firmware downgrade..)

I thought a hard mod was only useful to restore NAND backups that were made by the same console at an earlier version, since NAND backups are console-specific. Unless you have an backup from the same console, your only options are to buy a 3ds at a lower firmware, or wait for another exploit to be found.

Keep in mind that I haven't extensively researched hard mods, so I could be wrong.

Link to comment
Share on other sites

You know, I wouldn't even be surprised.. Everything on this damn thing is encrypted.. :/

My main source of info is GBATemp/reddit/random rom website and between threads people either keep contradicting eachothers, or just don't talk about those things.

It seems to me that all the info on the 3DS online is really unreliable, outdated, or incomplete.

Though, lower firmware 3ds aren't on sale anymore AFAIK. I've been looking around for one, and I can't find anything that isn't outrageously expensive.(factory sealed stuff..) And trying to get one used with a specific firmware is asking to get scammed.

I might just give up looking for PSMD's decrypted data at this point. I've been wasting way too much time on that. And I'll probably have to wait until citra can run things better to do anything in-depth with GTI..

EDIT: In other news, I think I finally got the basics of the FARC format figured out, in comparison to my original post on page1 : https://dl.dropboxusercontent.com/u/13343993/my_pmd_research_files/PMD_GTI/FileFormats/FARC_archive.txt

Link to comment
Share on other sites

To add to the info psy_commando posted above, some FARC files contain two SIR files (ex. message.bin). One is kind of an info file, which gives the offsets and size of the SIR files inside the second file.

It differs a tiny bit from the usual SIR file. Here's the format:

Header:
   Magic           4   "SIR0"
   Subheaderptr    4   Pointer to the subheader
   Offsetlistptr   4   Pointer to the offset list
   Null            4   Always zero

Filelist (array):
   Unknown         4   Some random value. Probably some ID
   Offset          4   The offset of the file
   Size            4   The size of the file

Subheader:
   Filelistptr     4   Pointer to the file list
   Filecount       4   Amount of files
   Unknown         4   Value: 1

Padding zero bytes to align to 16 bytes.

Offsetlist: http://www.projectpokemon.org/wiki/Pmd2_SIR0#Pointer_Offsets_List

Padding zero bytes to align to 16 bytes.

Edited by mid-kid
Link to comment
Share on other sites

To add to the info psy_commando posted above, some FARC files contain two SIR files (ex. message.bin). One is kind of an info file, which gives the offsets and size of the SIR files inside the second file.

It differs a tiny bit from the usual SIR file. Here's the format: http://chunk.io/f/1b5d738fe1eb4eb3bbce51444ffe0040?lang=text

That's pretty much the usual SIR0 format. The part below that begins with 0x04 0x04 is not another header, its the encoded pointer list.

SIR0 is just a wrapper around data, the content itself is what differ. Its used on stuff that gets loaded directly to memory as a data structure to translate pointers from relative to the file, to relative to the system memory.

http://www.projectpokemon.org/wiki/Pmd2_SIR0

I forgot to link my notes on it in this thread. But in GTI its exactly the same thing as it was in Rescue Team, and Explorers.

Link to comment
Share on other sites

Thanks to the info above, I was able to make a tool to unpack the message.bin.

I won't be working on it anymore, so I'll leave messagetool.py here: https://gist.github.com/mid-kid/8279635ee8dc57560e96

It unpacks the message.bin to readable, plain text files.

It mostly works, but there's some rough edges here and there.

I hope somebody can do something with it.

Usage:

Unpacking:

python3 messagetool.py extract message.bin messages_extracted

Packing:

python3 messagetool.py pack messages_extracted new_message.bin

Link to comment
Share on other sites

Thanks to the info above, I was able to make a tool to unpack the message.bin.

I won't be working on it anymore, so I'll leave messagetool.py here: https://gist.github.com/mid-kid/8279635ee8dc57560e96

It unpacks the message.bin to readable, plain text files.

It mostly works, but there's some rough edges here and there.

I hope somebody can do something with it.

Usage:

Unpacking:

python3 messagetool.py extract message.bin messages_extracted

Packing:

python3 messagetool.py pack messages_extracted new_message.bin

That looks pretty nice!

And any reasons you're giving up on it?

I've had something similar in the work, that also handles the string UUID and the extra unknown values from the table, but issues with utf-8/utf-16 handling on windows and the fact that the MSVC C++ stdlib is broken are holding me back. (That, and I also keep messing up my git branches by editing things unrelated to the current "topic" of the branch all the time.. I can't github flow ^^; )

I've also looked at using the stdlib's codecvt header, but thing is, MSVC doesn't support specialized string literals.. And the examples won't build.. And its all pretty unclear how it works. (And for some reasons my Codelite install can't use clang or gcc to compile..)

I've been looking at using ICU, but the build requirements are ridiculous.. I'd need to ship a full cygwin environment with it just to build on windows(or a script that setups said environment), and the library is huge.. http://source.icu-project.org/repos/icu/icu/trunk/readme.html#HowToBuildWindows

I might just use POCO's utf-8 utf-16 handling tools instead.. But they recommend using ICU instead.. Long story short, if anyone is ever looking at handling utf encoded text, don't use C++.. At least, until they add proper support in the few next revisions hopefully..

EDIT: Also, have you checked your PMs?

Edited by psy_commando
Link to comment
Share on other sites

And any reasons you're giving up on it?

None. Just went on working on something else at the moment.

The UTF-16 that's contained in the messages.bin is a bit weird in some places. Python can't completely decode it correctly either. I assume most of the characters that can't be decoded are formatting things the game uses. Some of the formatting characters can be decoded to UTF-8, however (finding out which and what they do is the hard part). In my script I just replace every character that can't be decoded with "{{unk:<hex>}}" (see decode_ninty_utf).

EDIT: Also, have you checked your PMs?

Yes, haven't gotten anything.

Link to comment
Share on other sites

None. Just went on working on something else at the moment.

The UTF-16 that's contained in the messages.bin is a bit weird in some places. Python can't completely decode it correctly either. I assume most of the characters that can't be decoded are formatting things the game uses. Some of the formatting characters can be decoded to UTF-8, however (finding out which and what they do is the hard part). In my script I just replace every character that can't be decoded with "{{unk:<hex>}}" (see decode_ninty_utf).

Alright, sorry for asking. I just feel like I might have sent the wrong message to people in the past, and I just wanted to make sure it wasn't the case here. ^^;

Hmm.. Maybe its not utf-16 then.. From what I've read around the web, 16 bits characters may also contain utf-8. Mainly because people tend to not follow a standard implementation.

Have you tried parsing everything as utf-8?

Also, you might want to just write escaped characters, for those you can't parse. It might make things easier when parsing it back.

I mean, writing it as a number prefixed with a "\u" or "\U" and etc, instead of using your own syntax.

https://docs.python.org/2/howto/unicode.html#unicode-literals-in-python-source-code

There are more chances that it would be compatible with other software and python itself, as its a pretty common way to escape unicode characters.

Also, now that you bring that up, its possible PMD2 is actually encoded in unicode too, which would explain some of the multi-byte symbols.. xD

http://unicode.org/faq/utf_bom.html

Link to comment
Share on other sites

Also, you might want to just write escaped characters, for those you can't parse. It might make things easier when parsing it back.

I mean, writing it as a number prefixed with a "\u" or "\U" and etc, instead of using your own syntax.

https://docs.python.org/2/howto/unicode.html#unicode-literals-in-python-source-code

There are more chances that it would be compatible with other software and python itself, as its a pretty common way to escape unicode characters.

Now that you mention it, that is indeed the correct™ way. I just didn't think of it at the time. I might fix it someday.

Link to comment
Share on other sites

Yes, haven't gotten anything.

Sorry, I missed your reply.. >_<

I sent you 3 PMs, so you should have received at least one of them. That's odd :/

You might want to check in your profile options if you have PMs on, or if you allow receiving PMs from others:

http://projectpokemon.org/forums/profile.php?do=editoptions

Link to comment
Share on other sites

  • 5 weeks later...

Yeah I saw it.. But I'm really unlucky/stupid, and now ironhax won't launch at all.. ;_;

I don't even know why. And I can't reinstall it because browserhax and youtubehax are dead.

Something wrong with the savegame maybe.. I suspect I might have somehow forgotten to update the ironhax install, and made a firmware update. But, I remember it working on this firmware a while ago..

I'm considering skipping on fallout 4 to get enough to buy cubic ninja for $60 at this point..

Link to comment
Share on other sites

I assumed you wanted to play backup games, sorry ;). But, still, $60 for a single game you may not play much is a lot ...

Have you got a friend having an exploited 3DS and a cartridge of OOT ? If so, you can install the corresponding exploit (although it's a bit tricky ...)

Link to comment
Share on other sites

I assumed you wanted to play backup games, sorry ;). But, still, $60 for a single game you may not play much is a lot ...

Have you got a friend having an exploited 3DS and a cartridge of OOT ? If so, you can install the corresponding exploit (although it's a bit tricky ...)

( I know, "backup games" sounds really cheesy, but I can't bring myself to use the term "piracy" because it makes me facepalm too hard and gives me a headache xD)

Yeah, but I'm getting really sick of screwing up everytimes some new exploit comes out. This is pretty much the 3-4th time I lock myself out of homebrew. Twice because I updated my firmware too soon. Then something else happened, and now I thought I finally took all precautions, but nope, I locked myself out again..

So something like cubic ninja might be ideal for me.

But then, I really don't have $60 dollar to spend on that cubic ninja game without cutting in my budget somewhere else. The most annoying part is that a bunch of people have been artificially raising prices for CN on ebay, buying a lot of them at gamestop and etc for peanuts, and selling them for 50+ dollars on auction sites and amazon.

And well, maybe in a week or two someone will find another entry point/fix the old ones, and I'd have spent $60 for nothing.

And nope, there isn't anyone I know with an unlocked 3ds living close-by :/

EDIT:

Welp, buying Cubic Ninja just isn't an option anymore.. Only the most expensive cartridges are left for sale now. I definitely can't pay $130 for that ^^;

I guess I could try to look around local pawn shops.. But I got the feeling that it will probably be a waster of time..

Edited by psy_commando
Link to comment
Share on other sites

Good news ! I managed to find a PSMD cia release that was decrypted! (after downloading about 1500 PSMD rom releases.. -_-)

So, I can confirm that, internally everything is mostly the same as GTI!

The game has still a lot of files named "paradise", and those are from GTI. Even the rom's "name" is still Paradise apparently. The scripts are organized in a similar fashion, and they're also simply compiled, not encrypted or anything else, I was able to decompile them the same way I did with GTI.

Interestingly, there's a file named "shiren_arts_data_info.bin" that was added to the "pokemon" folder, maybe this could have to do with IQs skills possibly? Since they were originally from shiren, and this file looks like it has been ripped from a shiren game judging from the name.. (I'll try looking up EMD to see if that was also in there )

Anyways, I won't be digging too deep into this until I've played the game, but I'll try to get some research going in the meantime.

I'd like to at least get a tool for extracting/repacking the faces along with FARC archives going, with source code and everything before PSMD is out in north america. Though with Fallout 4 coming out soon, that might get a bit delayed ^^;

Not to mention, I'm making some progress with the tiles format in PMD2, and it would be awkward to drop everything to work on PSMD/GTI instead.

Link to comment
Share on other sites

  • 3 weeks later...

PSMD is out in north america ! I got my copy and I'm now around chapter 12. Its an awesome game, and a worthy successor to Explorers of Sky in almost every ways, for those wondering! Its nothing like GTI, even though it re-uses the same engine ironically. xD

So whenever I finish this game, I should be ready to take it all apart without fearing for spoilers! xD

Also, I think evandixon has been working on some pretty nice stuff for handling eventual romhacks. But he'll probably drop by to talk about those himself eventually.

And I completely didn't meet my objective of getting a portrait utility out. But, at least now I mostly fixed my repository, and the PMD3 projects. I'll also drop compilation to DLL for pmd3 projects for now, because it was a dumb idea to begin with, and most of our research notes aren't set in stone yet, soo..

I'm also still looking for a way to document the game's Lua scripts. So if anyone has an idea for a way to do this with a tool or something, feel free to suggest!

Still couldn't find a cubic ninja copy, and now all cubic ninja games are around $100 CAD. So I'm considering getting a sky3ds instead, since its cheaper.. ( If only I could get MGS5 refunded ^^; )

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...