Battle points are visible
This commit is contained in:
parent
a193a4adf2
commit
7891a11fba
|
@ -6758,6 +6758,36 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit
|
||||||
|
|
||||||
"S_KARMAWHEEL", // Karma player wheels
|
"S_KARMAWHEEL", // Karma player wheels
|
||||||
|
|
||||||
|
"S_BATTLEPOINT1A", // Battle point indicators
|
||||||
|
"S_BATTLEPOINT1B",
|
||||||
|
"S_BATTLEPOINT1C",
|
||||||
|
"S_BATTLEPOINT1D",
|
||||||
|
"S_BATTLEPOINT1E",
|
||||||
|
"S_BATTLEPOINT1F",
|
||||||
|
"S_BATTLEPOINT1G",
|
||||||
|
"S_BATTLEPOINT1H",
|
||||||
|
"S_BATTLEPOINT1I",
|
||||||
|
|
||||||
|
"S_BATTLEPOINT2A",
|
||||||
|
"S_BATTLEPOINT2B",
|
||||||
|
"S_BATTLEPOINT2C",
|
||||||
|
"S_BATTLEPOINT2D",
|
||||||
|
"S_BATTLEPOINT2E",
|
||||||
|
"S_BATTLEPOINT2F",
|
||||||
|
"S_BATTLEPOINT2G",
|
||||||
|
"S_BATTLEPOINT2H",
|
||||||
|
"S_BATTLEPOINT2I",
|
||||||
|
|
||||||
|
"S_BATTLEPOINT3A",
|
||||||
|
"S_BATTLEPOINT3B",
|
||||||
|
"S_BATTLEPOINT3C",
|
||||||
|
"S_BATTLEPOINT3D",
|
||||||
|
"S_BATTLEPOINT3E",
|
||||||
|
"S_BATTLEPOINT3F",
|
||||||
|
"S_BATTLEPOINT3G",
|
||||||
|
"S_BATTLEPOINT3H",
|
||||||
|
"S_BATTLEPOINT3I",
|
||||||
|
|
||||||
// Thunder shield use stuff;
|
// Thunder shield use stuff;
|
||||||
"S_KSPARK1", // Sparkling Radius
|
"S_KSPARK1", // Sparkling Radius
|
||||||
"S_KSPARK2",
|
"S_KSPARK2",
|
||||||
|
@ -7515,6 +7545,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
|
||||||
"MT_KARMAHITBOX",
|
"MT_KARMAHITBOX",
|
||||||
"MT_KARMAWHEEL",
|
"MT_KARMAWHEEL",
|
||||||
|
|
||||||
|
"MT_BATTLEPOINT",
|
||||||
|
|
||||||
"MT_FZEROBOOM",
|
"MT_FZEROBOOM",
|
||||||
|
|
||||||
// Midnight Channel stuff:
|
// Midnight Channel stuff:
|
||||||
|
|
63
src/info.c
63
src/info.c
|
@ -60,9 +60,9 @@ char sprnames[NUMSPRITES + 1][5] =
|
||||||
"SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL",
|
"SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL",
|
||||||
"POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO",
|
"POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO",
|
||||||
"CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO",
|
"CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO",
|
||||||
"ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK","LZI1",
|
"ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1","HIT2","HIT3","RETI",
|
||||||
"LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1","GARU","MARR","REAP",
|
"AIDU","KSPK","LZI1","LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1",
|
||||||
"JITB","CDMO","CDBU","VIEW"
|
"GARU","MARR","REAP","JITB","CDMO","CDBU","VIEW"
|
||||||
};
|
};
|
||||||
|
|
||||||
// Doesn't work with g++, needs actionf_p1 (don't modify this comment)
|
// Doesn't work with g++, needs actionf_p1 (don't modify this comment)
|
||||||
|
@ -3046,6 +3046,36 @@ state_t states[NUMSTATES] =
|
||||||
|
|
||||||
{SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL
|
{SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL
|
||||||
|
|
||||||
|
{SPR_HIT1, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A
|
||||||
|
{SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1C}, // S_BATTLEPOINT1B
|
||||||
|
{SPR_HIT1, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT1D}, // S_BATTLEPOINT1C
|
||||||
|
{SPR_HIT1, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT1E}, // S_BATTLEPOINT1D
|
||||||
|
{SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1F}, // S_BATTLEPOINT1E
|
||||||
|
{SPR_HIT1, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT1G}, // S_BATTLEPOINT1F
|
||||||
|
{SPR_HIT1, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT1H}, // S_BATTLEPOINT1G
|
||||||
|
{SPR_HIT1, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT1I}, // S_BATTLEPOINT1H
|
||||||
|
{SPR_HIT1, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT1I
|
||||||
|
|
||||||
|
{SPR_HIT2, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A
|
||||||
|
{SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2C}, // S_BATTLEPOINT2B
|
||||||
|
{SPR_HIT2, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT2D}, // S_BATTLEPOINT2C
|
||||||
|
{SPR_HIT2, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT2E}, // S_BATTLEPOINT2D
|
||||||
|
{SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2F}, // S_BATTLEPOINT2E
|
||||||
|
{SPR_HIT2, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT2G}, // S_BATTLEPOINT2F
|
||||||
|
{SPR_HIT2, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT2H}, // S_BATTLEPOINT2G
|
||||||
|
{SPR_HIT2, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT2I}, // S_BATTLEPOINT2H
|
||||||
|
{SPR_HIT2, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT2I
|
||||||
|
|
||||||
|
{SPR_HIT3, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A
|
||||||
|
{SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3C}, // S_BATTLEPOINT3B
|
||||||
|
{SPR_HIT3, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT3D}, // S_BATTLEPOINT3C
|
||||||
|
{SPR_HIT3, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT3E}, // S_BATTLEPOINT3D
|
||||||
|
{SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3F}, // S_BATTLEPOINT3E
|
||||||
|
{SPR_HIT3, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT3G}, // S_BATTLEPOINT3F
|
||||||
|
{SPR_HIT3, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT3H}, // S_BATTLEPOINT3G
|
||||||
|
{SPR_HIT3, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT3I}, // S_BATTLEPOINT3H
|
||||||
|
{SPR_HIT3, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT3I
|
||||||
|
|
||||||
// Oh no it's annoying lightning states.......
|
// Oh no it's annoying lightning states.......
|
||||||
// Lightning Sparks (it's the ones we'll use for the radius)
|
// Lightning Sparks (it's the ones we'll use for the radius)
|
||||||
{SPR_KSPK, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_KSPARK2}, // S_KSPARK1
|
{SPR_KSPK, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_KSPARK2}, // S_KSPARK1
|
||||||
|
@ -17276,6 +17306,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
||||||
S_NULL // raisestate
|
S_NULL // raisestate
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ // MT_BATTLEPOINT
|
||||||
|
-1, // doomednum
|
||||||
|
S_INVISIBLE, // spawnstate
|
||||||
|
1000, // spawnhealth
|
||||||
|
S_NULL, // seestate
|
||||||
|
sfx_None, // seesound
|
||||||
|
8, // reactiontime
|
||||||
|
sfx_None, // attacksound
|
||||||
|
S_NULL, // painstate
|
||||||
|
0, // painchance
|
||||||
|
sfx_None, // painsound
|
||||||
|
S_NULL, // meleestate
|
||||||
|
S_NULL, // missilestate
|
||||||
|
S_NULL, // deathstate
|
||||||
|
S_NULL, // xdeathstate
|
||||||
|
sfx_None, // deathsound
|
||||||
|
8, // speed
|
||||||
|
8*FRACUNIT, // radius
|
||||||
|
8*FRACUNIT, // height
|
||||||
|
-1, // display offset
|
||||||
|
100, // mass
|
||||||
|
0, // damage
|
||||||
|
sfx_None, // activesound
|
||||||
|
MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
|
||||||
|
S_NULL // raisestate
|
||||||
|
},
|
||||||
|
|
||||||
{ // MT_FZEROBOOM
|
{ // MT_FZEROBOOM
|
||||||
-1, // doomednum
|
-1, // doomednum
|
||||||
S_INVISIBLE, // spawnstate
|
S_INVISIBLE, // spawnstate
|
||||||
|
|
37
src/info.h
37
src/info.h
|
@ -651,6 +651,11 @@ typedef enum sprite
|
||||||
SPR_WANT,
|
SPR_WANT,
|
||||||
|
|
||||||
SPR_PBOM, // player bomb
|
SPR_PBOM, // player bomb
|
||||||
|
|
||||||
|
SPR_HIT1, // battle points
|
||||||
|
SPR_HIT2, // battle points
|
||||||
|
SPR_HIT3, // battle points
|
||||||
|
|
||||||
SPR_RETI, // player reticule
|
SPR_RETI, // player reticule
|
||||||
|
|
||||||
SPR_AIDU,
|
SPR_AIDU,
|
||||||
|
@ -3620,6 +3625,36 @@ typedef enum state
|
||||||
|
|
||||||
S_KARMAWHEEL,
|
S_KARMAWHEEL,
|
||||||
|
|
||||||
|
S_BATTLEPOINT1A, // Battle point indicators
|
||||||
|
S_BATTLEPOINT1B,
|
||||||
|
S_BATTLEPOINT1C,
|
||||||
|
S_BATTLEPOINT1D,
|
||||||
|
S_BATTLEPOINT1E,
|
||||||
|
S_BATTLEPOINT1F,
|
||||||
|
S_BATTLEPOINT1G,
|
||||||
|
S_BATTLEPOINT1H,
|
||||||
|
S_BATTLEPOINT1I,
|
||||||
|
|
||||||
|
S_BATTLEPOINT2A,
|
||||||
|
S_BATTLEPOINT2B,
|
||||||
|
S_BATTLEPOINT2C,
|
||||||
|
S_BATTLEPOINT2D,
|
||||||
|
S_BATTLEPOINT2E,
|
||||||
|
S_BATTLEPOINT2F,
|
||||||
|
S_BATTLEPOINT2G,
|
||||||
|
S_BATTLEPOINT2H,
|
||||||
|
S_BATTLEPOINT2I,
|
||||||
|
|
||||||
|
S_BATTLEPOINT3A,
|
||||||
|
S_BATTLEPOINT3B,
|
||||||
|
S_BATTLEPOINT3C,
|
||||||
|
S_BATTLEPOINT3D,
|
||||||
|
S_BATTLEPOINT3E,
|
||||||
|
S_BATTLEPOINT3F,
|
||||||
|
S_BATTLEPOINT3G,
|
||||||
|
S_BATTLEPOINT3H,
|
||||||
|
S_BATTLEPOINT3I,
|
||||||
|
|
||||||
// Thunder shield use stuff;
|
// Thunder shield use stuff;
|
||||||
S_KSPARK1, // Sparkling Radius
|
S_KSPARK1, // Sparkling Radius
|
||||||
S_KSPARK2,
|
S_KSPARK2,
|
||||||
|
@ -4394,6 +4429,8 @@ typedef enum mobj_type
|
||||||
MT_KARMAHITBOX,
|
MT_KARMAHITBOX,
|
||||||
MT_KARMAWHEEL,
|
MT_KARMAWHEEL,
|
||||||
|
|
||||||
|
MT_BATTLEPOINT,
|
||||||
|
|
||||||
MT_FZEROBOOM,
|
MT_FZEROBOOM,
|
||||||
|
|
||||||
// Midnight Channel stuff:
|
// Midnight Channel stuff:
|
||||||
|
|
29
src/k_kart.c
29
src/k_kart.c
|
@ -1784,6 +1784,32 @@ void K_DoInstashield(player_t *player)
|
||||||
P_SetTarget(&layerb->target, player->mo);
|
P_SetTarget(&layerb->target, player->mo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount)
|
||||||
|
{
|
||||||
|
statenum_t st;
|
||||||
|
mobj_t *pt;
|
||||||
|
|
||||||
|
if (!source || !source->mo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (amount == 1)
|
||||||
|
st = S_BATTLEPOINT1A;
|
||||||
|
else if (amount == 2)
|
||||||
|
st = S_BATTLEPOINT2A;
|
||||||
|
else if (amount == 3)
|
||||||
|
st = S_BATTLEPOINT3A;
|
||||||
|
else
|
||||||
|
return; // NO STATE!
|
||||||
|
|
||||||
|
pt = P_SpawnMobj(source->mo->x, source->mo->y, source->mo->z, MT_BATTLEPOINT);
|
||||||
|
P_SetTarget(&pt->target, source->mo);
|
||||||
|
P_SetMobjState(pt, st);
|
||||||
|
if (victim && victim->skincolor)
|
||||||
|
pt->color = victim->skincolor;
|
||||||
|
else
|
||||||
|
pt->color = source->skincolor;
|
||||||
|
}
|
||||||
|
|
||||||
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem)
|
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem)
|
||||||
{
|
{
|
||||||
UINT8 scoremultiply = 1;
|
UINT8 scoremultiply = 1;
|
||||||
|
@ -1817,6 +1843,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem
|
||||||
if (source && source->player && player != source->player)
|
if (source && source->player && player != source->player)
|
||||||
{
|
{
|
||||||
P_AddPlayerScore(source->player, scoremultiply);
|
P_AddPlayerScore(source->player, scoremultiply);
|
||||||
|
K_SpawnBattlePoints(source->player, player, scoremultiply);
|
||||||
if (!trapitem)
|
if (!trapitem)
|
||||||
{
|
{
|
||||||
source->player->kartstuff[k_wanted] -= wantedreduce;
|
source->player->kartstuff[k_wanted] -= wantedreduce;
|
||||||
|
@ -1907,6 +1934,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source)
|
||||||
if (source && source->player && player != source->player)
|
if (source && source->player && player != source->player)
|
||||||
{
|
{
|
||||||
P_AddPlayerScore(source->player, scoremultiply);
|
P_AddPlayerScore(source->player, scoremultiply);
|
||||||
|
K_SpawnBattlePoints(source->player, player, scoremultiply);
|
||||||
source->player->kartstuff[k_wanted] -= wantedreduce;
|
source->player->kartstuff[k_wanted] -= wantedreduce;
|
||||||
player->kartstuff[k_wanted] -= (wantedreduce/2);
|
player->kartstuff[k_wanted] -= (wantedreduce/2);
|
||||||
}
|
}
|
||||||
|
@ -1996,6 +2024,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
|
||||||
if (source && source->player && player != source->player)
|
if (source && source->player && player != source->player)
|
||||||
{
|
{
|
||||||
P_AddPlayerScore(source->player, scoremultiply);
|
P_AddPlayerScore(source->player, scoremultiply);
|
||||||
|
K_SpawnBattlePoints(source->player, player, scoremultiply);
|
||||||
source->player->kartstuff[k_wanted] -= wantedreduce;
|
source->player->kartstuff[k_wanted] -= wantedreduce;
|
||||||
player->kartstuff[k_wanted] -= (wantedreduce/2);
|
player->kartstuff[k_wanted] -= (wantedreduce/2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ void K_KartMoveAnimation(player_t *player);
|
||||||
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
|
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
|
||||||
void K_KartPlayerAfterThink(player_t *player);
|
void K_KartPlayerAfterThink(player_t *player);
|
||||||
void K_DoInstashield(player_t *player);
|
void K_DoInstashield(player_t *player);
|
||||||
|
void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount);
|
||||||
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem);
|
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem);
|
||||||
void K_SquishPlayer(player_t *player, mobj_t *source);
|
void K_SquishPlayer(player_t *player, mobj_t *source);
|
||||||
void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor);
|
void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor);
|
||||||
|
|
|
@ -2109,6 +2109,20 @@ static int lib_kDoInstashield(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_kSpawnBattlePoints(lua_State *L)
|
||||||
|
{
|
||||||
|
player_t *source = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
player_t *victim = *((player_t **)luaL_checkudata(L, 2, META_PLAYER));
|
||||||
|
UINT8 amount = (UINT8)luaL_checkinteger(L, 3);
|
||||||
|
NOHUD
|
||||||
|
if (!source)
|
||||||
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
if (!victim)
|
||||||
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
K_SpawnBattlePoints(source, victim, amount);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int lib_kSpinPlayer(lua_State *L)
|
static int lib_kSpinPlayer(lua_State *L)
|
||||||
{
|
{
|
||||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
@ -2500,6 +2514,7 @@ static luaL_Reg lib[] = {
|
||||||
{"K_KartBouncing",lib_kKartBouncing},
|
{"K_KartBouncing",lib_kKartBouncing},
|
||||||
{"K_MatchGenericExtraFlags",lib_kMatchGenericExtraFlags},
|
{"K_MatchGenericExtraFlags",lib_kMatchGenericExtraFlags},
|
||||||
{"K_DoInstashield",lib_kDoInstashield},
|
{"K_DoInstashield",lib_kDoInstashield},
|
||||||
|
{"K_SpawnBattlePoints",lib_kSpawnBattlePoints},
|
||||||
{"K_SpinPlayer",lib_kSpinPlayer},
|
{"K_SpinPlayer",lib_kSpinPlayer},
|
||||||
{"K_SquishPlayer",lib_kSquishPlayer},
|
{"K_SquishPlayer",lib_kSquishPlayer},
|
||||||
{"K_ExplodePlayer",lib_kExplodePlayer},
|
{"K_ExplodePlayer",lib_kExplodePlayer},
|
||||||
|
|
22
src/p_mobj.c
22
src/p_mobj.c
|
@ -8323,6 +8323,28 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
}
|
}
|
||||||
P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z);
|
P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z);
|
||||||
break;
|
break;
|
||||||
|
case MT_BATTLEPOINT:
|
||||||
|
if (!mobj->target || P_MobjWasRemoved(mobj->target))
|
||||||
|
{
|
||||||
|
P_RemoveMobj(mobj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mobj->movefactor < 48*mobj->target->scale)
|
||||||
|
{
|
||||||
|
mobj->movefactor += (48*mobj->target->scale)/6;
|
||||||
|
if (mobj->movefactor > mobj->target->height)
|
||||||
|
mobj->movefactor = mobj->target->height;
|
||||||
|
}
|
||||||
|
else if (mobj->movefactor > 48*mobj->target->scale)
|
||||||
|
{
|
||||||
|
mobj->movefactor -= (48*mobj->target->scale)/6;
|
||||||
|
if (mobj->movefactor < mobj->target->height)
|
||||||
|
mobj->movefactor = mobj->target->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z + (mobj->target->height/2) + mobj->movefactor);
|
||||||
|
break;
|
||||||
case MT_THUNDERSHIELD:
|
case MT_THUNDERSHIELD:
|
||||||
{
|
{
|
||||||
fixed_t destx, desty;
|
fixed_t destx, desty;
|
||||||
|
|
Loading…
Reference in a new issue