diff --git a/core/data/alembic/versions/49c295e89cd4_chunithm_verse.py b/core/data/alembic/versions/49c295e89cd4_chunithm_verse.py
index 61b813f..d52e445 100644
--- a/core/data/alembic/versions/49c295e89cd4_chunithm_verse.py
+++ b/core/data/alembic/versions/49c295e89cd4_chunithm_verse.py
@@ -44,7 +44,7 @@ def upgrade():
mysql_charset="utf8mb4",
)
- op.create_tablee(
+ op.create_table(
"chuni_item_unlock_challenge",
sa.Column("id", sa.Integer(), primary_key=True, nullable=False),
sa.Column("version", sa.Integer(), nullable=False),
@@ -59,7 +59,7 @@ def upgrade():
sa.Column("conditionType", sa.Integer()),
sa.Column("score", sa.Integer()),
sa.Column("life", sa.Integer()),
- sa.Column("clearDate", sa.Integer()),
+ sa.Column("clearDate", sa.TIMESTAMP(), server_defaul=func.now()),
sa.UniqueConstraint(
"version",
"user",
diff --git a/titles/chuni/frontend.py b/titles/chuni/frontend.py
index 1059d7c..e860400 100644
--- a/titles/chuni/frontend.py
+++ b/titles/chuni/frontend.py
@@ -655,14 +655,18 @@ class ChuniFrontend(FE_Base):
form_data = await request.form()
new_nameplate: str = form_data.get("nameplate")
new_trophy: str = form_data.get("trophy")
+ new_trophy_sub_1: str = form_data.get("trophySub1")
+ new_trophy_sub_2: str = form_data.get("trophySub2")
new_character: str = form_data.get("character")
if not new_nameplate or \
not new_trophy or \
+ not new_trophy_sub_1 or \
+ not new_trophy_sub_2 or \
not new_character:
return RedirectResponse("/game/chuni/userbox?e=4", 303)
- if not await self.data.profile.update_userbox(usr_sesh.user_id, usr_sesh.chunithm_version, new_nameplate, new_trophy, new_character):
+ if not await self.data.profile.update_userbox(usr_sesh.user_id, usr_sesh.chunithm_version, new_nameplate, new_trophy, new_trophy_sub_1, new_trophy_sub_2, new_character):
return RedirectResponse("/gate/?e=999", 303)
return RedirectResponse("/game/chuni/userbox", 303)
diff --git a/titles/chuni/schema/item.py b/titles/chuni/schema/item.py
index 84c6364..90b993f 100644
--- a/titles/chuni/schema/item.py
+++ b/titles/chuni/schema/item.py
@@ -293,7 +293,7 @@ unlock_challenge = Table(
Column("conditionType", Integer),
Column("score", Integer),
Column("life", Integer),
- Column("clearDate", TIMESTAMP),
+ Column("clearDate", TIMESTAMP, server_default=func.now()),
UniqueConstraint(
"version", "user", "unlockChallengeId", name="chuni_item_unlock_challenge_uk"
),
diff --git a/titles/chuni/schema/profile.py b/titles/chuni/schema/profile.py
index 5f54f5e..c642514 100644
--- a/titles/chuni/schema/profile.py
+++ b/titles/chuni/schema/profile.py
@@ -463,12 +463,12 @@ class ChuniProfileData(BaseData):
return False
return True
- async def update_userbox(self, user_id: int, version: int, new_nameplate: int, new_trophy: int, new_character: int) -> bool:
+ async def update_userbox(self, user_id: int, version: int, new_nameplate: int, new_trophy: int, new_trophy_sub_1: int, new_trophy_sub_2: int, new_character: int) -> bool:
sql = profile.update((profile.c.user == user_id) & (profile.c.version == version)).values(
nameplateId=new_nameplate,
trophyId=new_trophy,
- trophyIdSub1=new_trophySub1,
- trophyIdSub2=new_trophySub2,
+ trophyIdSub1=new_trophy_sub_1,
+ trophyIdSub2=new_trophy_sub_2,
charaIllustId=new_character
)
result = await self.execute(sql)
diff --git a/titles/chuni/templates/chuni_userbox.jinja b/titles/chuni/templates/chuni_userbox.jinja
index 5114b17..3bca2fd 100644
--- a/titles/chuni/templates/chuni_userbox.jinja
+++ b/titles/chuni/templates/chuni_userbox.jinja
@@ -44,7 +44,25 @@
Nameplate: | |
Trophy: |
- |
+
+ Trophy Sub 1: |
+
+
+ {% for item in trophies.values() %}
+
+ {% endfor %}
+
+ |
+
+ Trophy Sub 2: |
+
+
{% for item in trophies.values() %}
{% endfor %}
@@ -124,7 +142,10 @@ userbox_components = {
};
types = Object.keys(userbox_components);
orig_trophy = curr_trophy = "{{ profile.trophyId }}";
+orig_trophy_sub_1 = curr_trophy_sub_1 = "{{ profile.trophyIdSub1 }}";
+orig_trophy_sub_2 = curr_trophy_sub_2 = "{{ profile.trophyIdSub2 }}";
curr_trophy_img = "";
+curr_trophy_name = "";
function enableButtons(enabled) {
document.getElementById("reset-btn").disabled = !enabled;
@@ -169,6 +190,7 @@ function changeTrophy() {
var trophy_element = document.getElementById("trophy");
curr_trophy = trophy_element.value;
+ curr_trophy_name = trophy_element[trophy_element.selectedIndex].innerText
curr_trophy_img = getRankImage(trophy_element[trophy_element.selectedIndex]);
updatePreview();
if (curr_trophy != orig_trophy) {
@@ -176,12 +198,38 @@ function changeTrophy() {
}
}
+function changeTrophySub1() {
+ var trophy_element = document.getElementById("trophy-sub-1");
+
+ curr_trophy_sub_1 = trophy_element.value;
+ curr_trophy_img = getRankImage(trophy_element[trophy_element.selectedIndex]);
+ curr_trophy_name = trophy_element[trophy_element.selectedIndex].innerText
+ updatePreview();
+ if (curr_trophy_sub_1 != orig_trophy_sub_1) {
+ enableButtons(true);
+ }
+}
+
+function changeTrophySub2() {
+ var trophy_element = document.getElementById("trophy-sub-2");
+
+ curr_trophy_sub_2 = trophy_element.value;
+ curr_trophy_img = getRankImage(trophy_element[trophy_element.selectedIndex]);
+ curr_trophy_name = trophy_element[trophy_element.selectedIndex].innerText
+ updatePreview();
+ if (curr_trophy_sub_2 != orig_trophy_sub_2) {
+ enableButtons(true);
+ }
+}
+
function resetUserbox() {
for (const type of types) {
changeItem(type, userbox_components[type][orig_id], userbox_components[type][orig_name], userbox_components[type][orig_img]);
}
// reset trophy
document.getElementById("trophy").value = orig_trophy;
+ document.getElementById("trophy-sub-1").value = orig_trophy_sub_1;
+ document.getElementById("trophy-sub-2").value = orig_trophy_sub_2;
changeTrophy();
// disable the save/reset buttons until something changes
enableButtons(false);
@@ -193,12 +241,14 @@ function updatePreview() {
document.getElementById("name_" + type).innerHTML = userbox_components[type][curr_name];
}
document.getElementById("preview_trophy_rank").src = "img/rank/" + curr_trophy_img;
- document.getElementById("preview_trophy_name").innerHTML = document.getElementById("trophy")[document.getElementById("trophy").selectedIndex].innerText;
+ document.getElementById("preview_trophy_name").innerHTML = curr_trophy_name;
}
function saveUserbox() {
$.post("/game/chuni/update.userbox", { nameplate: userbox_components["nameplate"][curr_id],
- trophy: curr_trophy,
+ trophy: curr_trophy,
+ trophySub1: curr_trophy_sub_1,
+ trophySub2: curr_trophy_sub_2,
character: userbox_components["character"][curr_id] })
.done(function (data) {
// set the current as the original and disable buttons
@@ -207,7 +257,9 @@ function saveUserbox() {
userbox_components[type][orig_name] = userbox_components[type][orig_name];
userbox_components[type][orig_img] = userbox_components[type][curr_img];
}
- orig_trophy = curr_trophy
+ orig_trophy = curr_trophy;
+ orig_trophy_sub_1 = curr_trophy_sub_1;
+ orig_trophy_sub_2 = curr_trophy_sub_2;
enableButtons(false);
})
.fail(function () {
diff --git a/titles/chuni/verse.py b/titles/chuni/verse.py
index 6932bda..9d59b5e 100644
--- a/titles/chuni/verse.py
+++ b/titles/chuni/verse.py
@@ -29,11 +29,9 @@ class ChuniVerse(ChuniLuminousPlus):
for unlock_challenge in unlock_challenges:
course_ids = [
- unlock_challenge["courseId1"],
- unlock_challenge["courseId2"],
- unlock_challenge["courseId3"],
- unlock_challenge["courseId4"],
- unlock_challenge["courseId5"],
+ unlock_challenge[f"courseId{i}"]
+ for i in range(1, 6)
+ if unlock_challenge[f"courseId{i}"] is not None
]
start_date = unlock_challenge["startDate"].replace(
@@ -60,7 +58,7 @@ class ChuniVerse(ChuniLuminousPlus):
"length": len(game_course_level_list),
"gameCourseLevelList": game_course_level_list,
}
-
+
async def handle_get_game_u_c_condition_api_request(self, data: Dict) -> Dict:
unlock_challenges = await self.data.static.get_unlock_challenges(self.version)
game_unlock_challenge_condition_list = []
@@ -84,8 +82,8 @@ class ChuniVerse(ChuniLuminousPlus):
unlock_condition = conditions.get(
unlock_challenge_id,
{
- "type": MapAreaConditionType.ALWAYS_UNLOCKED.value, # always unlocked
- "conditionId": -1,
+ "type": MapAreaConditionType.TROPHY_OBTAINED.value, # always unlocked
+ "conditionId": 0,
},
)
|