Added directory for migration scripts and added item_ball migration script (#3997)
* Created migration script README Added Jasper's migration script to migration directory * Updated relative file paths * Moved from migration to migration_scripts * Update migration_scripts/item_ball_refactor.py Updated script per feedback https://github.com/rh-hideout/pokeemerald-expansion/pull/3997#discussion_r1453367466 Co-authored-by: Bassoonian <iasperbassoonian@gmail.com> --------- Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
parent
e1cd7b61ed
commit
778712b366
2 changed files with 139 additions and 0 deletions
54
migration_scripts/README.md
Normal file
54
migration_scripts/README.md
Normal file
|
@ -0,0 +1,54 @@
|
|||
# Migration Scripts
|
||||
|
||||
## What are migration scripts?
|
||||
|
||||
pokeemerald-expansion rewrites existing systems in pokeemerald to improve their efficiency and make them easier to use and implement for developers. If developers were previously using a system that has been deprecated, it can be difficult to manually migrate between systems.
|
||||
|
||||
These scripts exist to help developers make the transition between refactored systems.
|
||||
|
||||
## Requirements
|
||||
|
||||
All migration scripts require [`python3`](https://www.python.org/downloads/) to be installed. Migration scripts are executed by running the following commands from the root directory of a developer's project.
|
||||
|
||||
```bash
|
||||
chmod +x migration_scripts/*.py ; #give permision to make the script executable
|
||||
python3 migration_scripts/*.py ; #run the migration script
|
||||
```
|
||||
|
||||
`*` will need to be replaced with the name of the appropriate script.
|
||||
|
||||
### Item Balls
|
||||
|
||||
* Filepath [`migration_scripts/item_ball_refactor.py`](item_ball_refactor.py)
|
||||
* Introduced in [Item Ball refactor / Pluralize item names for giveitem and finditem #3942](https://github.com/rh-hideout/pokeemerald-expansion/pull/3942)
|
||||
|
||||
Modifies all item ball scripts defined using to original Game Freak method to the new refactored method.
|
||||
|
||||
#### [data/scripts/item_ball_scripts.inc](../data/scripts/item_ball_scripts.inc)
|
||||
```diff
|
||||
- Route102_EventScript_ItemPotion::
|
||||
- finditem ITEM_POTION
|
||||
+ Common_EventScript_FindItem::
|
||||
+ callnative GetObjectEventTrainerRangeFromTemplate
|
||||
+ finditem VAR_RESULT
|
||||
end
|
||||
```
|
||||
|
||||
#### [data/maps/Route102/map.json](../data/maps/Route102/map.json)
|
||||
```diff
|
||||
{
|
||||
"graphics_id": "OBJ_EVENT_GFX_ITEM_BALL",
|
||||
"x": 50,
|
||||
"y": 5,
|
||||
"elevation": 3,
|
||||
"movement_type": "MOVEMENT_TYPE_LOOK_AROUND",
|
||||
"movement_range_x": 1,
|
||||
"movement_range_y": 1,
|
||||
"trainer_type": "TRAINER_TYPE_NONE",
|
||||
- "trainer_sight_or_berry_tree_id": "0",
|
||||
- "script": "Route102_EventScript_ItemPotion",
|
||||
+ "trainer_sight_or_berry_tree_id": "ITEM_POTION",
|
||||
+ "script": "Common_EventScript_FindItem",
|
||||
"flag": "FLAG_ITEM_ROUTE_102_POTION"
|
||||
},
|
||||
```
|
85
migration_scripts/item_ball_refactor.py
Executable file
85
migration_scripts/item_ball_refactor.py
Executable file
|
@ -0,0 +1,85 @@
|
|||
import glob
|
||||
import re
|
||||
import json
|
||||
import os
|
||||
|
||||
if not os.path.exists("Makefile"):
|
||||
print("Please run this script from your root folder.")
|
||||
quit()
|
||||
|
||||
# scan incs
|
||||
incs_to_check = glob.glob('./data/scripts/*.inc') # all .incs in the script folder
|
||||
incs_to_check += glob.glob('./data/maps/*/scripts.inc') # all map scripts
|
||||
pories_to_check = glob.glob('./data/scripts/*.pory') ## all .porys in the script folder
|
||||
pories_to_check += glob.glob('./data/maps/*/scripts.pory') # all map scripts
|
||||
|
||||
array = []
|
||||
array_pories = []
|
||||
|
||||
# make a list of which script corresponds to which item
|
||||
for file in incs_to_check:
|
||||
with open(file, "r") as f2:
|
||||
raw = f2.read()
|
||||
array += re.findall("(.*)::\n[ ]*finditem (.*)\n[ ]*end", raw)
|
||||
|
||||
# since this doesn't catch poryscript-generated inc files, do the same for poryscript
|
||||
for file in pories_to_check:
|
||||
with open(file, "r") as f2:
|
||||
raw = f2.read()
|
||||
array_pories += re.findall("script ([\w]*)[ \n]*\{[ \n]*finditem\((.*)\)[ \n]*\}", raw)
|
||||
|
||||
dict = {}
|
||||
# poryscript values are prioritised because they would overwrite inc files anyway if different
|
||||
for x in array_pories:
|
||||
dict[x[0]] = x[1]
|
||||
for x in array:
|
||||
if not x[0] in dict:
|
||||
dict[x[0]] = x[1]
|
||||
|
||||
# apply changes to inc files
|
||||
for map in glob.glob('./data/maps/*/map.json'):
|
||||
with open(map, "r") as f2:
|
||||
data = json.load(f2)
|
||||
if not 'object_events' in data:
|
||||
continue
|
||||
for objevent in data['object_events']:
|
||||
if objevent["script"] in dict:
|
||||
objevent["trainer_sight_or_berry_tree_id"] = dict[objevent["script"]]
|
||||
objevent["script"] = "Common_EventScript_FindItem"
|
||||
with open(map, "w") as f2:
|
||||
f2.write(json.dumps(data, indent=2) + "\n")
|
||||
|
||||
# do another map search to find out which finditem scripts would somehow be still in use
|
||||
still_in_use = []
|
||||
for map in glob.glob('./data/maps/*/map.json'):
|
||||
with open(map, "r") as f2:
|
||||
data = json.load(f2)
|
||||
if not 'object_events' in data:
|
||||
continue
|
||||
for objevent in data['object_events']:
|
||||
if objevent["script"] in dict and not objevent["script"] in still_in_use:
|
||||
still_in_use.append(objevent["script"])
|
||||
|
||||
for x in list(dict.keys()):
|
||||
if x in still_in_use:
|
||||
del dict[x]
|
||||
|
||||
# clean up scripts that are now no longer in use
|
||||
for file in incs_to_check:
|
||||
with open(file, "r") as f2:
|
||||
raw = f2.read()
|
||||
for unused in list(dict.keys()):
|
||||
raw = re.sub("%s::\n[ ]*finditem (.*)\n[ ]*end\n*" % unused, "", raw)
|
||||
with open(file, "w") as f2:
|
||||
f2.write(raw)
|
||||
|
||||
# also clean up pory files
|
||||
for file in pories_to_check:
|
||||
with open(file, "r") as f2:
|
||||
raw = f2.read()
|
||||
for unused in list(dict.keys()):
|
||||
raw = re.sub("script %s[ \n]*\{[ \n]*finditem\((.*)\)[ \n]*\}[ \n]*" % unused, "", raw)
|
||||
with open(file, "w") as f2:
|
||||
f2.write(raw)
|
||||
|
||||
print("Done!")
|
Loading…
Reference in a new issue