mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Merge pull request #11490 from deReeperJosh/skylandersportalandroid
Android: Skylanders Portal UI
This commit is contained in:
+101
-4
@@ -9,6 +9,7 @@ import android.content.SharedPreferences;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.Pair;
|
||||
import android.util.SparseIntArray;
|
||||
import android.view.InputDevice;
|
||||
import android.view.KeyEvent;
|
||||
@@ -33,12 +34,14 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
|
||||
import org.dolphinemu.dolphinemu.NativeLibrary;
|
||||
import org.dolphinemu.dolphinemu.R;
|
||||
import org.dolphinemu.dolphinemu.databinding.ActivityEmulationBinding;
|
||||
import org.dolphinemu.dolphinemu.databinding.DialogInputAdjustBinding;
|
||||
import org.dolphinemu.dolphinemu.databinding.DialogIrSensitivityBinding;
|
||||
import org.dolphinemu.dolphinemu.databinding.DialogSkylandersManagerBinding;
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting;
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.IntSetting;
|
||||
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
|
||||
@@ -46,6 +49,10 @@ import org.dolphinemu.dolphinemu.features.settings.model.StringSetting;
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
|
||||
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity;
|
||||
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
|
||||
import org.dolphinemu.dolphinemu.features.skylanders.SkylanderConfig;
|
||||
import org.dolphinemu.dolphinemu.features.skylanders.model.Skylander;
|
||||
import org.dolphinemu.dolphinemu.features.skylanders.ui.SkylanderSlot;
|
||||
import org.dolphinemu.dolphinemu.features.skylanders.ui.SkylanderSlotAdapter;
|
||||
import org.dolphinemu.dolphinemu.fragments.EmulationFragment;
|
||||
import org.dolphinemu.dolphinemu.fragments.MenuFragment;
|
||||
import org.dolphinemu.dolphinemu.fragments.SaveLoadStateFragment;
|
||||
@@ -63,6 +70,7 @@ import org.dolphinemu.dolphinemu.utils.ThemeHelper;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static java.lang.annotation.RetentionPolicy.SOURCE;
|
||||
@@ -75,6 +83,8 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
private static final String BACKSTACK_NAME_MENU = "menu";
|
||||
private static final String BACKSTACK_NAME_SUBMENU = "submenu";
|
||||
public static final int REQUEST_CHANGE_DISC = 1;
|
||||
public static final int REQUEST_SKYLANDER_FILE = 2;
|
||||
public static final int REQUEST_CREATE_SKYLANDER = 3;
|
||||
|
||||
private EmulationFragment mEmulationFragment;
|
||||
|
||||
@@ -101,6 +111,10 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
public static final String EXTRA_SYSTEM_MENU = "SystemMenu";
|
||||
public static final String EXTRA_USER_PAUSED_EMULATION = "sUserPausedEmulation";
|
||||
public static final String EXTRA_MENU_TOAST_SHOWN = "MenuToastShown";
|
||||
public static final String EXTRA_SKYLANDER_SLOT = "SkylanderSlot";
|
||||
public static final String EXTRA_SKYLANDER_ID = "SkylanderId";
|
||||
public static final String EXTRA_SKYLANDER_VAR = "SkylanderVar";
|
||||
public static final String EXTRA_SKYLANDER_NAME = "SkylanderName";
|
||||
|
||||
@Retention(SOURCE)
|
||||
@IntDef(
|
||||
@@ -115,7 +129,7 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
MENU_ACTION_RESET_OVERLAY, MENU_SET_IR_RECENTER, MENU_SET_IR_MODE,
|
||||
MENU_SET_IR_SENSITIVITY, MENU_ACTION_CHOOSE_DOUBLETAP, MENU_ACTION_MOTION_CONTROLS,
|
||||
MENU_ACTION_PAUSE_EMULATION, MENU_ACTION_UNPAUSE_EMULATION, MENU_ACTION_OVERLAY_CONTROLS,
|
||||
MENU_ACTION_SETTINGS})
|
||||
MENU_ACTION_SETTINGS, MENU_ACTION_SKYLANDERS})
|
||||
public @interface MenuAction
|
||||
{
|
||||
}
|
||||
@@ -156,6 +170,15 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
public static final int MENU_ACTION_UNPAUSE_EMULATION = 33;
|
||||
public static final int MENU_ACTION_OVERLAY_CONTROLS = 34;
|
||||
public static final int MENU_ACTION_SETTINGS = 35;
|
||||
public static final int MENU_ACTION_SKYLANDERS = 36;
|
||||
|
||||
private Skylander mSkylanderData = new Skylander(-1, -1, "Slot");
|
||||
|
||||
private int mSkylanderSlot = -1;
|
||||
|
||||
private DialogSkylandersManagerBinding mSkylandersBinding;
|
||||
|
||||
private static List<SkylanderSlot> sSkylanderSlots = new ArrayList<>();
|
||||
|
||||
private static final SparseIntArray buttonsActionsMap = new SparseIntArray();
|
||||
|
||||
@@ -361,6 +384,14 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
|
||||
if (NativeLibrary.IsGameMetadataValid())
|
||||
setTitle(NativeLibrary.GetCurrentTitleDescription());
|
||||
|
||||
if (sSkylanderSlots.isEmpty())
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
sSkylanderSlots.add(new SkylanderSlot(getString(R.string.skylander_slot, i + 1), i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -373,6 +404,10 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
outState.putStringArray(EXTRA_SELECTED_GAMES, mPaths);
|
||||
outState.putBoolean(EXTRA_USER_PAUSED_EMULATION, sUserPausedEmulation);
|
||||
outState.putBoolean(EXTRA_MENU_TOAST_SHOWN, mMenuToastShown);
|
||||
outState.putInt(EXTRA_SKYLANDER_SLOT, mSkylanderSlot);
|
||||
outState.putInt(EXTRA_SKYLANDER_ID, mSkylanderData.getId());
|
||||
outState.putInt(EXTRA_SKYLANDER_VAR, mSkylanderData.getVar());
|
||||
outState.putString(EXTRA_SKYLANDER_NAME, mSkylanderData.getName());
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
@@ -381,6 +416,10 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
mPaths = savedInstanceState.getStringArray(EXTRA_SELECTED_GAMES);
|
||||
sUserPausedEmulation = savedInstanceState.getBoolean(EXTRA_USER_PAUSED_EMULATION);
|
||||
mMenuToastShown = savedInstanceState.getBoolean(EXTRA_MENU_TOAST_SHOWN);
|
||||
mSkylanderSlot = savedInstanceState.getInt(EXTRA_SKYLANDER_SLOT);
|
||||
mSkylanderData = new Skylander(savedInstanceState.getInt(EXTRA_SKYLANDER_ID),
|
||||
savedInstanceState.getInt(EXTRA_SKYLANDER_VAR),
|
||||
savedInstanceState.getString(EXTRA_SKYLANDER_NAME));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -486,13 +525,40 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent result)
|
||||
{
|
||||
super.onActivityResult(requestCode, resultCode, result);
|
||||
if (requestCode == REQUEST_CHANGE_DISC)
|
||||
// If the user picked a file, as opposed to just backing out.
|
||||
if (resultCode == RESULT_OK)
|
||||
{
|
||||
// If the user picked a file, as opposed to just backing out.
|
||||
if (resultCode == RESULT_OK)
|
||||
if (requestCode == REQUEST_CHANGE_DISC)
|
||||
{
|
||||
NativeLibrary.ChangeDisc(result.getData().toString());
|
||||
}
|
||||
else if (requestCode == REQUEST_SKYLANDER_FILE)
|
||||
{
|
||||
Pair<Integer, String> slot =
|
||||
SkylanderConfig.loadSkylander(sSkylanderSlots.get(mSkylanderSlot).getPortalSlot(),
|
||||
result.getData().toString());
|
||||
clearSkylander(mSkylanderSlot);
|
||||
sSkylanderSlots.get(mSkylanderSlot).setPortalSlot(slot.first);
|
||||
sSkylanderSlots.get(mSkylanderSlot).setLabel(slot.second);
|
||||
mSkylandersBinding.skylandersManager.getAdapter().notifyItemChanged(mSkylanderSlot);
|
||||
mSkylanderSlot = -1;
|
||||
mSkylanderData = Skylander.BLANK_SKYLANDER;
|
||||
}
|
||||
else if (requestCode == REQUEST_CREATE_SKYLANDER)
|
||||
{
|
||||
if (!(mSkylanderData.getId() == -1) && !(mSkylanderData.getVar() == -1))
|
||||
{
|
||||
Pair<Integer, String> slot = SkylanderConfig.createSkylander(mSkylanderData.getId(),
|
||||
mSkylanderData.getVar(),
|
||||
result.getData().toString(), sSkylanderSlots.get(mSkylanderSlot).getPortalSlot());
|
||||
clearSkylander(mSkylanderSlot);
|
||||
sSkylanderSlots.get(mSkylanderSlot).setPortalSlot(slot.first);
|
||||
sSkylanderSlots.get(mSkylanderSlot).setLabel(slot.second);
|
||||
mSkylandersBinding.skylandersManager.getAdapter().notifyItemChanged(mSkylanderSlot);
|
||||
mSkylanderSlot = -1;
|
||||
mSkylanderData = Skylander.BLANK_SKYLANDER;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -773,6 +839,10 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
SettingsActivity.launch(this, MenuTag.SETTINGS);
|
||||
break;
|
||||
|
||||
case MENU_ACTION_SKYLANDERS:
|
||||
showSkylanderPortalSettings();
|
||||
break;
|
||||
|
||||
case MENU_ACTION_EXIT:
|
||||
mEmulationFragment.stopEmulation();
|
||||
break;
|
||||
@@ -1110,6 +1180,33 @@ public final class EmulationActivity extends AppCompatActivity implements ThemeP
|
||||
.show();
|
||||
}
|
||||
|
||||
private void showSkylanderPortalSettings()
|
||||
{
|
||||
mSkylandersBinding =
|
||||
DialogSkylandersManagerBinding.inflate(getLayoutInflater());
|
||||
mSkylandersBinding.skylandersManager.setLayoutManager(new LinearLayoutManager(this));
|
||||
|
||||
mSkylandersBinding.skylandersManager.setAdapter(
|
||||
new SkylanderSlotAdapter(sSkylanderSlots, this));
|
||||
|
||||
new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.skylanders_manager)
|
||||
.setView(mSkylandersBinding.getRoot())
|
||||
.show();
|
||||
}
|
||||
|
||||
public void setSkylanderData(int id, int var, String name, int slot)
|
||||
{
|
||||
mSkylanderData = new Skylander(id, var, name);
|
||||
mSkylanderSlot = slot;
|
||||
}
|
||||
|
||||
public void clearSkylander(int slot)
|
||||
{
|
||||
sSkylanderSlots.get(slot).setLabel(getString(R.string.skylander_slot, slot + 1));
|
||||
mSkylandersBinding.skylandersManager.getAdapter().notifyItemChanged(slot);
|
||||
}
|
||||
|
||||
private void resetOverlay()
|
||||
{
|
||||
new MaterialAlertDialogBuilder(this)
|
||||
|
||||
+4
@@ -89,6 +89,9 @@ public enum BooleanSetting implements AbstractBooleanSetting
|
||||
MAIN_DEBUG_JIT_REGISTER_CACHE_OFF(Settings.FILE_DOLPHIN, Settings.SECTION_DEBUG,
|
||||
"JitRegisterCacheOff", false),
|
||||
|
||||
MAIN_EMULATE_SKYLANDER_PORTAL(Settings.FILE_DOLPHIN, Settings.SECTION_EMULATED_USB_DEVICES,
|
||||
"EmulateSkylanderPortal", false),
|
||||
|
||||
MAIN_SHOW_GAME_TITLES(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID,
|
||||
"ShowGameTitles", true),
|
||||
MAIN_USE_BLACK_BACKGROUNDS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID,
|
||||
@@ -273,6 +276,7 @@ public enum BooleanSetting implements AbstractBooleanSetting
|
||||
MAIN_RAM_OVERRIDE_ENABLE,
|
||||
MAIN_CUSTOM_RTC_ENABLE,
|
||||
MAIN_DSP_JIT,
|
||||
MAIN_EMULATE_SKYLANDER_PORTAL,
|
||||
};
|
||||
|
||||
private static final Set<BooleanSetting> NOT_RUNTIME_EDITABLE =
|
||||
|
||||
+1
@@ -42,6 +42,7 @@ public class Settings implements Closeable
|
||||
public static final String SECTION_GFX_HACKS = "Hacks";
|
||||
|
||||
public static final String SECTION_DEBUG = "Debug";
|
||||
public static final String SECTION_EMULATED_USB_DEVICES = "EmulatedUSBDevices";
|
||||
|
||||
public static final String SECTION_STEREOSCOPY = "Stereoscopy";
|
||||
|
||||
|
||||
+6
@@ -263,7 +263,9 @@ public final class SettingsFragmentPresenter
|
||||
{
|
||||
sl.add(new SubmenuSetting(mContext, R.string.gcpad_settings, MenuTag.GCPAD_TYPE));
|
||||
if (mSettings.isWii())
|
||||
{
|
||||
sl.add(new SubmenuSetting(mContext, R.string.wiimote_settings, MenuTag.WIIMOTE));
|
||||
}
|
||||
}
|
||||
|
||||
sl.add(new HeaderSetting(mContext, R.string.setting_clear_info, 0));
|
||||
@@ -633,6 +635,10 @@ public final class SettingsFragmentPresenter
|
||||
R.string.wiimote_scanning, R.string.wiimote_scanning_description));
|
||||
sl.add(new SwitchSetting(mContext, BooleanSetting.MAIN_WIIMOTE_ENABLE_SPEAKER,
|
||||
R.string.wiimote_speaker, R.string.wiimote_speaker_description));
|
||||
|
||||
sl.add(new HeaderSetting(mContext, R.string.emulated_usb_devices, 0));
|
||||
sl.add(new SwitchSetting(mContext, BooleanSetting.MAIN_EMULATE_SKYLANDER_PORTAL,
|
||||
R.string.emulate_skylander_portal, 0));
|
||||
}
|
||||
|
||||
private void addAdvancedSettings(ArrayList<SettingsItem> sl)
|
||||
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.skylanders;
|
||||
|
||||
import android.util.Pair;
|
||||
|
||||
import org.dolphinemu.dolphinemu.features.skylanders.model.SkylanderPair;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class SkylanderConfig
|
||||
{
|
||||
public static final Map<SkylanderPair, String> LIST_SKYLANDERS;
|
||||
public static final Map<String, SkylanderPair> REVERSE_LIST_SKYLANDERS;
|
||||
|
||||
static
|
||||
{
|
||||
LIST_SKYLANDERS = getSkylanderMap();
|
||||
REVERSE_LIST_SKYLANDERS = getInverseSkylanderMap();
|
||||
}
|
||||
|
||||
public static native Map<SkylanderPair, String> getSkylanderMap();
|
||||
|
||||
public static native Map<String, SkylanderPair> getInverseSkylanderMap();
|
||||
|
||||
public static native boolean removeSkylander(int slot);
|
||||
|
||||
public static native Pair<Integer, String> loadSkylander(int slot, String fileName);
|
||||
|
||||
public static native Pair<Integer, String> createSkylander(int id, int var, String fileName,
|
||||
int slot);
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.skylanders.model;
|
||||
|
||||
public class Skylander
|
||||
{
|
||||
private SkylanderPair mPair;
|
||||
private String mName;
|
||||
|
||||
public final static Skylander BLANK_SKYLANDER = new Skylander(-1, -1, "Blank");
|
||||
|
||||
public Skylander(int id, int var, String name)
|
||||
{
|
||||
mPair = new SkylanderPair(id, var);
|
||||
mName = name;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return mName;
|
||||
}
|
||||
|
||||
public void setName(String name)
|
||||
{
|
||||
this.mName = name;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return mPair.getId();
|
||||
}
|
||||
|
||||
public int getVar()
|
||||
{
|
||||
return mPair.getVar();
|
||||
}
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.skylanders.model;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
public class SkylanderPair
|
||||
{
|
||||
private int mId;
|
||||
private int mVar;
|
||||
|
||||
public SkylanderPair(int id, int var)
|
||||
{
|
||||
mId = id;
|
||||
mVar = var;
|
||||
}
|
||||
|
||||
public int getId()
|
||||
{
|
||||
return mId;
|
||||
}
|
||||
|
||||
public void setId(int mId)
|
||||
{
|
||||
this.mId = mId;
|
||||
}
|
||||
|
||||
public int getVar()
|
||||
{
|
||||
return mVar;
|
||||
}
|
||||
|
||||
public void setVar(int mVar)
|
||||
{
|
||||
this.mVar = mVar;
|
||||
}
|
||||
|
||||
@Override public int hashCode()
|
||||
{
|
||||
return (mId << 16) + mVar;
|
||||
}
|
||||
|
||||
@Override public boolean equals(@Nullable Object obj)
|
||||
{
|
||||
if (!(obj instanceof SkylanderPair))
|
||||
return false;
|
||||
SkylanderPair pairObj = (SkylanderPair) obj;
|
||||
if (pairObj.getId() != mId)
|
||||
return false;
|
||||
if (pairObj.getVar() != mVar)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.skylanders.ui;
|
||||
|
||||
public class SkylanderSlot
|
||||
{
|
||||
private String mLabel;
|
||||
private final int mSlotNum;
|
||||
private int mPortalSlot;
|
||||
|
||||
public SkylanderSlot(String label, int slot)
|
||||
{
|
||||
mLabel = label;
|
||||
mSlotNum = slot;
|
||||
mPortalSlot = -1;
|
||||
}
|
||||
|
||||
public String getLabel()
|
||||
{
|
||||
return mLabel;
|
||||
}
|
||||
|
||||
public void setLabel(String label)
|
||||
{
|
||||
mLabel = label;
|
||||
}
|
||||
|
||||
public int getSlotNum()
|
||||
{
|
||||
return mSlotNum;
|
||||
}
|
||||
|
||||
public int getPortalSlot()
|
||||
{
|
||||
return mPortalSlot;
|
||||
}
|
||||
|
||||
public void setPortalSlot(int mPortalSlot)
|
||||
{
|
||||
this.mPortalSlot = mPortalSlot;
|
||||
}
|
||||
}
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.dolphinemu.dolphinemu.features.skylanders.ui;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import org.dolphinemu.dolphinemu.R;
|
||||
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
|
||||
import org.dolphinemu.dolphinemu.databinding.DialogCreateSkylanderBinding;
|
||||
import org.dolphinemu.dolphinemu.databinding.ListItemSkylanderSlotBinding;
|
||||
import org.dolphinemu.dolphinemu.features.skylanders.SkylanderConfig;
|
||||
import org.dolphinemu.dolphinemu.features.skylanders.model.SkylanderPair;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SkylanderSlotAdapter extends RecyclerView.Adapter<SkylanderSlotAdapter.ViewHolder>
|
||||
implements AdapterView.OnItemClickListener
|
||||
{
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
public ListItemSkylanderSlotBinding binding;
|
||||
|
||||
public ViewHolder(@NonNull ListItemSkylanderSlotBinding binding)
|
||||
{
|
||||
super(binding.getRoot());
|
||||
this.binding = binding;
|
||||
}
|
||||
}
|
||||
|
||||
private final List<SkylanderSlot> mSlots;
|
||||
private final EmulationActivity mActivity;
|
||||
|
||||
private DialogCreateSkylanderBinding mBinding;
|
||||
|
||||
public SkylanderSlotAdapter(List<SkylanderSlot> slots, EmulationActivity context)
|
||||
{
|
||||
mSlots = slots;
|
||||
mActivity = context;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public SkylanderSlotAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
|
||||
{
|
||||
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
|
||||
ListItemSkylanderSlotBinding binding =
|
||||
ListItemSkylanderSlotBinding.inflate(inflater, parent, false);
|
||||
return new ViewHolder(binding);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
|
||||
{
|
||||
SkylanderSlot slot = mSlots.get(position);
|
||||
holder.binding.textSkylanderName.setText(slot.getLabel());
|
||||
|
||||
holder.binding.buttonClearSkylander.setOnClickListener(v ->
|
||||
{
|
||||
SkylanderConfig.removeSkylander(slot.getPortalSlot());
|
||||
mActivity.clearSkylander(slot.getSlotNum());
|
||||
});
|
||||
|
||||
holder.binding.buttonLoadSkylander.setOnClickListener(v ->
|
||||
{
|
||||
Intent loadSkylander = new Intent(Intent.ACTION_OPEN_DOCUMENT);
|
||||
loadSkylander.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
loadSkylander.setType("*/*");
|
||||
mActivity.setSkylanderData(0, 0, "", position);
|
||||
mActivity.startActivityForResult(loadSkylander, EmulationActivity.REQUEST_SKYLANDER_FILE);
|
||||
});
|
||||
|
||||
LayoutInflater inflater = LayoutInflater.from(mActivity);
|
||||
mBinding = DialogCreateSkylanderBinding.inflate(inflater);
|
||||
|
||||
List<String> skylanderNames = new ArrayList<>(SkylanderConfig.REVERSE_LIST_SKYLANDERS.keySet());
|
||||
skylanderNames.sort(String::compareToIgnoreCase);
|
||||
|
||||
mBinding.skylanderDropdown.setAdapter(
|
||||
new ArrayAdapter<>(mActivity, R.layout.support_simple_spinner_dropdown_item,
|
||||
skylanderNames));
|
||||
mBinding.skylanderDropdown.setOnItemClickListener(this);
|
||||
|
||||
holder.binding.buttonCreateSkylander.setOnClickListener(v ->
|
||||
{
|
||||
if (mBinding.getRoot().getParent() != null)
|
||||
{
|
||||
((ViewGroup) mBinding.getRoot().getParent()).removeAllViews();
|
||||
}
|
||||
AlertDialog createDialog = new MaterialAlertDialogBuilder(mActivity)
|
||||
.setTitle(R.string.create_skylander_title)
|
||||
.setView(mBinding.getRoot())
|
||||
.setPositiveButton(R.string.create_skylander, null)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.show();
|
||||
createDialog.getButton(android.app.AlertDialog.BUTTON_POSITIVE).setOnClickListener(
|
||||
v1 ->
|
||||
{
|
||||
if (!mBinding.skylanderId.getText().toString().isBlank() &&
|
||||
!mBinding.skylanderVar.getText().toString().isBlank())
|
||||
{
|
||||
Intent createSkylander = new Intent(Intent.ACTION_CREATE_DOCUMENT);
|
||||
createSkylander.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
createSkylander.setType("*/*");
|
||||
int id = Integer.parseInt(mBinding.skylanderId.getText().toString());
|
||||
int var = Integer.parseInt(mBinding.skylanderVar.getText().toString());
|
||||
String name = SkylanderConfig.LIST_SKYLANDERS.get(new SkylanderPair(id, var));
|
||||
if (name != null)
|
||||
{
|
||||
createSkylander.putExtra(Intent.EXTRA_TITLE,
|
||||
name + ".sky");
|
||||
mActivity.setSkylanderData(id, var, name, position);
|
||||
}
|
||||
else
|
||||
{
|
||||
createSkylander.putExtra(Intent.EXTRA_TITLE,
|
||||
"Unknown(ID" + id + "Var" + var + ").sky");
|
||||
mActivity.setSkylanderData(id, var, "Unknown", position);
|
||||
}
|
||||
mActivity.startActivityForResult(createSkylander,
|
||||
EmulationActivity.REQUEST_CREATE_SKYLANDER);
|
||||
createDialog.dismiss();
|
||||
}
|
||||
else
|
||||
{
|
||||
Toast.makeText(mActivity, R.string.invalid_skylander,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount()
|
||||
{
|
||||
return mSlots.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
|
||||
{
|
||||
SkylanderPair skylanderIdVar =
|
||||
SkylanderConfig.REVERSE_LIST_SKYLANDERS.get(parent.getItemAtPosition(position));
|
||||
mBinding.skylanderId.setText(String.valueOf(skylanderIdVar.getId()));
|
||||
mBinding.skylanderVar.setText(String.valueOf(skylanderIdVar.getVar()));
|
||||
}
|
||||
}
|
||||
@@ -60,6 +60,7 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
|
||||
buttonsActionsMap.append(R.id.menu_change_disc, EmulationActivity.MENU_ACTION_CHANGE_DISC);
|
||||
buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT);
|
||||
buttonsActionsMap.append(R.id.menu_settings, EmulationActivity.MENU_ACTION_SETTINGS);
|
||||
buttonsActionsMap.append(R.id.menu_skylanders, EmulationActivity.MENU_ACTION_SKYLANDERS);
|
||||
}
|
||||
|
||||
private FragmentIngameMenuBinding mBinding;
|
||||
@@ -110,6 +111,12 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
|
||||
if (!getArguments().getBoolean(KEY_WII, true))
|
||||
{
|
||||
mBinding.menuRefreshWiimotes.setVisibility(View.GONE);
|
||||
mBinding.menuSkylanders.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if (!BooleanSetting.MAIN_EMULATE_SKYLANDER_PORTAL.getBooleanGlobal())
|
||||
{
|
||||
mBinding.menuSkylanders.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
LinearLayout options = mBinding.layoutOptions;
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="?attr/colorControlNormal"
|
||||
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12 19,6.41z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="?attr/colorControlNormal"
|
||||
android:pathData="M6,20Q5.175,20 4.588,19.413Q4,18.825 4,18V15H6V18Q6,18 6,18Q6,18 6,18H18Q18,18 18,18Q18,18 18,18V15H20V18Q20,18.825 19.413,19.413Q18.825,20 18,20ZM11,16V7.85L8.4,10.45L7,9L12,4L17,9L15.6,10.45L13,7.85V16Z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/root"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="@dimen/spacing_medlarge">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/layout_skylander_dropdown"
|
||||
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="@dimen/spacing_medlarge"
|
||||
android:paddingHorizontal="@dimen/spacing_medlarge"
|
||||
android:hint="@string/skylander_label"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||
android:id="@+id/skylander_dropdown"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:spinnerMode="dialog"
|
||||
android:imeOptions="actionDone" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintTop_toBottomOf="@+id/layout_skylander_dropdown"
|
||||
android:gravity="center_vertical"
|
||||
android:baselineAligned="false">
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/layout_skylander_id"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:hint="@string/skylander_id"
|
||||
android:paddingHorizontal="@dimen/spacing_medlarge">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/skylander_id"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="number" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/layout_skylander_var"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:hint="@string/skylander_variant"
|
||||
android:paddingHorizontal="@dimen/spacing_medlarge">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/skylander_var"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="number" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/skylanders_manager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:scrollbars="vertical"
|
||||
android:fadeScrollbars="false"/>
|
||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||
@@ -101,6 +101,11 @@
|
||||
android:text="@string/emulation_change_disc"
|
||||
style="@style/InGameMenuOption" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_skylanders"
|
||||
android:text="@string/emulate_skylander_portal"
|
||||
style="@style/InGameMenuOption" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout android:id="@+id/root"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="@dimen/spacing_medlarge">
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_create_skylander"
|
||||
style="?attr/materialIconButtonFilledTonalStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginEnd="@dimen/spacing_small"
|
||||
android:layout_toStartOf="@id/button_load_skylander"
|
||||
android:contentDescription="@string/create_skylander"
|
||||
android:tooltipText="@string/create_skylander"
|
||||
app:icon="@drawable/ic_add" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_load_skylander"
|
||||
style="?attr/materialIconButtonFilledTonalStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginEnd="@dimen/spacing_small"
|
||||
android:layout_toStartOf="@+id/button_clear_skylander"
|
||||
android:contentDescription="@string/load_skylander"
|
||||
android:tooltipText="@string/load_skylander"
|
||||
app:icon="@drawable/ic_load" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_clear_skylander"
|
||||
style="?attr/materialIconButtonFilledTonalStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginEnd="@dimen/spacing_large"
|
||||
android:contentDescription="@string/remove_skylander"
|
||||
android:tooltipText="@string/remove_skylander"
|
||||
app:icon="@drawable/ic_clear" />
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/text_skylander_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginBottom="@dimen/spacing_medlarge"
|
||||
android:layout_marginEnd="@dimen/spacing_large"
|
||||
android:layout_marginStart="@dimen/spacing_large"
|
||||
android:layout_toStartOf="@+id/button_create_skylander"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="?attr/colorOnSurface"
|
||||
android:textSize="16sp"
|
||||
tools:text="Wii Remote with Motion Plus Pointing" />
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -909,4 +909,18 @@ It can efficiently compress both junk data and encrypted Wii data.
|
||||
<string name="about_support"><a href="https://forums.dolphin-emu.org/">Support</a></string>
|
||||
<string name="about_copyright_warning">\u00A9 2003–2015+ Dolphin Team. \u201cGameCube\u201d and \u201cWii\u201d are trademarks of Nintendo. Dolphin is not affiliated with Nintendo in any way.</string>
|
||||
|
||||
<!-- Emulated USB Devices -->
|
||||
<string name="emulated_usb_devices">Emulated USB Devices</string>
|
||||
<string name="emulate_skylander_portal">Skylanders Portal</string>
|
||||
<string name="skylanders_manager">Skylanders Manager</string>
|
||||
<string name="load_skylander">Load</string>
|
||||
<string name="remove_skylander">Remove</string>
|
||||
<string name="create_skylander">Create</string>
|
||||
<string name="create_skylander_title">Create Skylander</string>
|
||||
<string name="skylander_label">Skylander</string>
|
||||
<string name="skylander_slot">Slot %1$d</string>
|
||||
<string name="skylander_id">ID</string>
|
||||
<string name="skylander_variant">Variant</string>
|
||||
<string name="invalid_skylander">Invalid Skylander Selection</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -14,6 +14,7 @@ add_library(main SHARED
|
||||
IniFile.cpp
|
||||
MainAndroid.cpp
|
||||
RiivolutionPatches.cpp
|
||||
SkylanderConfig.cpp
|
||||
WiiUtils.cpp
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
// Copyright 2023 Dolphin Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
#include <array>
|
||||
|
||||
#include "AndroidCommon/AndroidCommon.h"
|
||||
#include "Core/IOS/USB/Emulated/Skylander.h"
|
||||
#include "Core/System.h"
|
||||
|
||||
extern "C" {
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_getSkylanderMap(JNIEnv* env,
|
||||
jclass clazz)
|
||||
{
|
||||
jclass hash_map_class = env->FindClass("java/util/HashMap");
|
||||
jmethodID hash_map_init = env->GetMethodID(hash_map_class, "<init>", "(I)V");
|
||||
jobject hash_map_obj = env->NewObject(hash_map_class, hash_map_init,
|
||||
static_cast<u16>(IOS::HLE::USB::list_skylanders.size()));
|
||||
jmethodID hash_map_put = env->GetMethodID(
|
||||
hash_map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
||||
|
||||
jclass skylander_class =
|
||||
env->FindClass("org/dolphinemu/dolphinemu/features/skylanders/model/SkylanderPair");
|
||||
|
||||
jmethodID skylander_init = env->GetMethodID(skylander_class, "<init>", "(II)V");
|
||||
|
||||
for (const auto& it : IOS::HLE::USB::list_skylanders)
|
||||
{
|
||||
const std::string& name = it.second;
|
||||
jobject skylander_obj =
|
||||
env->NewObject(skylander_class, skylander_init, it.first.first, it.first.second);
|
||||
env->CallObjectMethod(hash_map_obj, hash_map_put, skylander_obj, ToJString(env, name));
|
||||
env->DeleteLocalRef(skylander_obj);
|
||||
}
|
||||
|
||||
return hash_map_obj;
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_getInverseSkylanderMap(
|
||||
JNIEnv* env, jclass clazz)
|
||||
{
|
||||
jclass hash_map_class = env->FindClass("java/util/HashMap");
|
||||
jmethodID hash_map_init = env->GetMethodID(hash_map_class, "<init>", "(I)V");
|
||||
jobject hash_map_obj = env->NewObject(hash_map_class, hash_map_init,
|
||||
static_cast<u16>(IOS::HLE::USB::list_skylanders.size()));
|
||||
jmethodID hash_map_put = env->GetMethodID(
|
||||
hash_map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
||||
|
||||
jclass skylander_class =
|
||||
env->FindClass("org/dolphinemu/dolphinemu/features/skylanders/model/SkylanderPair");
|
||||
|
||||
jmethodID skylander_init = env->GetMethodID(skylander_class, "<init>", "(II)V");
|
||||
|
||||
for (const auto& it : IOS::HLE::USB::list_skylanders)
|
||||
{
|
||||
const std::string& name = it.second;
|
||||
jobject skylander_obj =
|
||||
env->NewObject(skylander_class, skylander_init, it.first.first, it.first.second);
|
||||
env->CallObjectMethod(hash_map_obj, hash_map_put, ToJString(env, name), skylander_obj);
|
||||
env->DeleteLocalRef(skylander_obj);
|
||||
}
|
||||
|
||||
return hash_map_obj;
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_removeSkylander(JNIEnv* env,
|
||||
jclass clazz,
|
||||
jint slot)
|
||||
{
|
||||
auto& system = Core::System::GetInstance();
|
||||
return static_cast<jboolean>(system.GetSkylanderPortal().RemoveSkylander(slot));
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_loadSkylander(JNIEnv* env,
|
||||
jclass clazz,
|
||||
jint slot,
|
||||
jstring file_name)
|
||||
{
|
||||
File::IOFile sky_file(GetJString(env, file_name), "r+b");
|
||||
if (!sky_file)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
std::array<u8, 0x40 * 0x10> file_data;
|
||||
if (!sky_file.ReadBytes(file_data.data(), file_data.size()))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
jclass pair_class = env->FindClass("android/util/Pair");
|
||||
jmethodID pair_init =
|
||||
env->GetMethodID(pair_class, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
|
||||
jclass integer_class = env->FindClass("java/lang/Integer");
|
||||
jmethodID int_init = env->GetMethodID(integer_class, "<init>", "(I)V");
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
system.GetSkylanderPortal().RemoveSkylander(slot);
|
||||
std::string name = "Unknown";
|
||||
|
||||
std::pair<u16, u16> id_var = system.GetSkylanderPortal().CalculateIDs(file_data);
|
||||
|
||||
const auto it = IOS::HLE::USB::list_skylanders.find(std::make_pair(id_var.first, id_var.second));
|
||||
|
||||
if (it != IOS::HLE::USB::list_skylanders.end())
|
||||
{
|
||||
name = it->second;
|
||||
}
|
||||
|
||||
return env->NewObject(pair_class, pair_init,
|
||||
env->NewObject(integer_class, int_init,
|
||||
system.GetSkylanderPortal().LoadSkylander(
|
||||
file_data.data(), std::move(sky_file))),
|
||||
ToJString(env, name));
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_org_dolphinemu_dolphinemu_features_skylanders_SkylanderConfig_createSkylander(
|
||||
JNIEnv* env, jclass clazz, jint id, jint var, jstring fileName, jint slot)
|
||||
{
|
||||
u16 sky_id = static_cast<u16>(id);
|
||||
u16 sky_var = static_cast<u16>(var);
|
||||
|
||||
std::string file_name = GetJString(env, fileName);
|
||||
|
||||
auto& system = Core::System::GetInstance();
|
||||
system.GetSkylanderPortal().CreateSkylander(file_name, sky_id, sky_var);
|
||||
system.GetSkylanderPortal().RemoveSkylander(slot);
|
||||
|
||||
jclass pair_class = env->FindClass("android/util/Pair");
|
||||
jmethodID pair_init =
|
||||
env->GetMethodID(pair_class, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V");
|
||||
|
||||
jclass integer_class = env->FindClass("java/lang/Integer");
|
||||
jmethodID integer_init = env->GetMethodID(integer_class, "<init>", "(I)V");
|
||||
|
||||
File::IOFile sky_file(file_name, "r+b");
|
||||
if (!sky_file)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
std::array<u8, 0x40 * 0x10> file_data;
|
||||
if (!sky_file.ReadBytes(file_data.data(), file_data.size()))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::string name = "Unknown";
|
||||
|
||||
const auto it = IOS::HLE::USB::list_skylanders.find(std::make_pair(sky_id, sky_var));
|
||||
|
||||
if (it != IOS::HLE::USB::list_skylanders.end())
|
||||
{
|
||||
name = it->second;
|
||||
}
|
||||
|
||||
return env->NewObject(pair_class, pair_init,
|
||||
env->NewObject(integer_class, integer_init,
|
||||
system.GetSkylanderPortal().LoadSkylander(
|
||||
file_data.data(), std::move(sky_file))),
|
||||
ToJString(env, name));
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user