This commit is contained in:
parent
cbd3a6bf90
commit
dc0966e06f
5 changed files with 126 additions and 80 deletions
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include "FX\FXAttachAnim.h"
|
#include "FX\FXAttachAnim.h"
|
||||||
|
|
||||||
|
#include "FX\FXLaser.h"
|
||||||
#include "FX\FXThwack.h"
|
#include "FX\FXThwack.h"
|
||||||
#include "FX\FXBubble.h"
|
#include "FX\FXBubble.h"
|
||||||
#include "FX\FXfallingTile.h"
|
#include "FX\FXfallingTile.h"
|
||||||
|
@ -39,7 +40,7 @@ CFXBaseAnim::sFXAnim FXWaterSplashData=
|
||||||
127,127,255,
|
127,127,255,
|
||||||
0,
|
0,
|
||||||
{0,0},
|
{0,0},
|
||||||
0,
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
CFXBaseAnim::sFXAnim FXAcidSplashData=
|
CFXBaseAnim::sFXAnim FXAcidSplashData=
|
||||||
|
@ -50,7 +51,7 @@ CFXBaseAnim::sFXAnim FXAcidSplashData=
|
||||||
127,255,127,
|
127,255,127,
|
||||||
0,
|
0,
|
||||||
{0,0},
|
{0,0},
|
||||||
0
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
CFXBaseAnim::sFXAnim FXLavaSplashData=
|
CFXBaseAnim::sFXAnim FXLavaSplashData=
|
||||||
{
|
{
|
||||||
|
@ -60,7 +61,7 @@ CFXBaseAnim::sFXAnim FXLavaSplashData=
|
||||||
255,0,0,
|
255,0,0,
|
||||||
0,
|
0,
|
||||||
{0,0},
|
{0,0},
|
||||||
0
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
CFXBaseAnim::sFXAnim FXOilSplashData=
|
CFXBaseAnim::sFXAnim FXOilSplashData=
|
||||||
{
|
{
|
||||||
|
@ -81,7 +82,7 @@ CFXBaseAnim::sFXAnim FXExplodeData=
|
||||||
127,127,127,
|
127,127,127,
|
||||||
0,
|
0,
|
||||||
{0,0},
|
{0,0},
|
||||||
0
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
CFXBaseAnim::sFXAnim FXFireData=
|
CFXBaseAnim::sFXAnim FXFireData=
|
||||||
|
@ -92,7 +93,7 @@ CFXBaseAnim::sFXAnim FXFireData=
|
||||||
127,127,127,
|
127,127,127,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_TRANS,
|
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_TRANS,
|
||||||
{0,0},
|
{0,0},
|
||||||
0
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
CFXBaseAnim::sFXAnim FXWaterDripData=
|
CFXBaseAnim::sFXAnim FXWaterDripData=
|
||||||
|
@ -145,7 +146,7 @@ CFXBaseAnim::sFXAnim FXBubbleWaterData=
|
||||||
127,127,255,
|
127,127,255,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL,
|
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL,
|
||||||
{0,-1},
|
{0,-1},
|
||||||
CFX::FX_TYPE_SPLASH_WATER
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
CFXBaseAnim::sFXAnim FXBubbleAcidData=
|
CFXBaseAnim::sFXAnim FXBubbleAcidData=
|
||||||
|
@ -156,7 +157,7 @@ CFXBaseAnim::sFXAnim FXBubbleAcidData=
|
||||||
0,255,0,
|
0,255,0,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL,
|
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL,
|
||||||
{0,-1},
|
{0,-1},
|
||||||
CFX::FX_TYPE_SPLASH_WATER
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
CFXBaseAnim::sFXAnim FXBubbleLavaData=
|
CFXBaseAnim::sFXAnim FXBubbleLavaData=
|
||||||
{
|
{
|
||||||
|
@ -166,7 +167,7 @@ CFXBaseAnim::sFXAnim FXBubbleLavaData=
|
||||||
255,0,0,
|
255,0,0,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL,
|
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL,
|
||||||
{0,-1},
|
{0,-1},
|
||||||
CFX::FX_TYPE_SPLASH_WATER
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
CFXBaseAnim::sFXAnim FXBubbleOilData=
|
CFXBaseAnim::sFXAnim FXBubbleOilData=
|
||||||
{
|
{
|
||||||
|
@ -176,7 +177,7 @@ CFXBaseAnim::sFXAnim FXBubbleOilData=
|
||||||
32,32,32,
|
32,32,32,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL,
|
CFXBaseAnim::FXANIM_FLAG_LOOP | CFXBaseAnim::FXANIM_FLAG_COLLIDE_KILL,
|
||||||
{0,-1},
|
{0,-1},
|
||||||
CFX::FX_TYPE_SPLASH_WATER
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
CFXBaseAnim::sFXAnim FXWaterFountainData=
|
CFXBaseAnim::sFXAnim FXWaterFountainData=
|
||||||
|
@ -187,7 +188,7 @@ CFXBaseAnim::sFXAnim FXWaterFountainData=
|
||||||
127,127,255,
|
127,127,255,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP,
|
CFXBaseAnim::FXANIM_FLAG_LOOP,
|
||||||
{0,0},
|
{0,0},
|
||||||
0,
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
CFXBaseAnim::sFXAnim FXAcidFountainData=
|
CFXBaseAnim::sFXAnim FXAcidFountainData=
|
||||||
{
|
{
|
||||||
|
@ -197,7 +198,7 @@ CFXBaseAnim::sFXAnim FXAcidFountainData=
|
||||||
0,255,0,
|
0,255,0,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP,
|
CFXBaseAnim::FXANIM_FLAG_LOOP,
|
||||||
{0,0},
|
{0,0},
|
||||||
0,
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
CFXBaseAnim::sFXAnim FXLavaFountainData=
|
CFXBaseAnim::sFXAnim FXLavaFountainData=
|
||||||
{
|
{
|
||||||
|
@ -207,7 +208,7 @@ CFXBaseAnim::sFXAnim FXLavaFountainData=
|
||||||
255,0,0,
|
255,0,0,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP,
|
CFXBaseAnim::FXANIM_FLAG_LOOP,
|
||||||
{0,0},
|
{0,0},
|
||||||
0,
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
CFXBaseAnim::sFXAnim FXOilFountainData=
|
CFXBaseAnim::sFXAnim FXOilFountainData=
|
||||||
{
|
{
|
||||||
|
@ -217,22 +218,20 @@ CFXBaseAnim::sFXAnim FXOilFountainData=
|
||||||
32,32,32,
|
32,32,32,
|
||||||
CFXBaseAnim::FXANIM_FLAG_LOOP,
|
CFXBaseAnim::FXANIM_FLAG_LOOP,
|
||||||
{0,0},
|
{0,0},
|
||||||
0,
|
CFX::FX_TYPE_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*
|
|
||||||
CFXSteam *TestFXPtr=0;
|
CFXLaser *TestFXPtr=0;
|
||||||
void TestFX(DVECTOR Pos)
|
void TestFX(DVECTOR Pos,CThing *Parent)
|
||||||
{
|
{
|
||||||
if (!TestFXPtr)
|
if (!TestFXPtr)
|
||||||
{
|
{
|
||||||
Pos.vx=256;
|
TestFXPtr=(CFXLaser*)CFX::Create(CFX::FX_TYPE_LASER,Parent);
|
||||||
Pos.vy=128;
|
// TestFXPtr->setLife(32);
|
||||||
TestFXPtr=(CFXSteam*)CFX::Create(CFX::FX_TYPE_STEAM,Pos);
|
// TestFXPtr->setRelativeToMap(false);
|
||||||
TestFXPtr->setLife(32);
|
// TestFXPtr=0;
|
||||||
TestFXPtr->setRelativeToMap(false);
|
|
||||||
TestFXPtr=0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -240,18 +239,27 @@ void TestFX(DVECTOR Pos)
|
||||||
TestFXPtr=0;
|
TestFXPtr=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
int FXType=(CFX::FX_TYPE)CFX::FX_TYPE_THWACK;
|
/*
|
||||||
|
int FXType=(CFX::FX_TYPE)CFX::FX_TYPE_LASER;
|
||||||
#include "game\game.h"
|
#include "game\game.h"
|
||||||
|
|
||||||
|
int OX=32;
|
||||||
|
int OY=32;
|
||||||
void TestFX(DVECTOR Pos,CThing *Parent)
|
void TestFX(DVECTOR Pos,CThing *Parent)
|
||||||
{
|
{
|
||||||
//CFXAttachAnim *FX=(CFXAttachAnim*)CFX::Create((CFX::FX_TYPE)FXType,Pos);
|
CFXLaser *FX=(CFXLaser*)CFX::Create((CFX::FX_TYPE)FXType,Pos);
|
||||||
|
|
||||||
|
// FX->setOrigin(Pos);
|
||||||
|
Pos.vx+=OX;
|
||||||
|
Pos.vy+=OY;
|
||||||
|
FX->setTarget(Pos);
|
||||||
// Parent->addChild(FX);
|
// Parent->addChild(FX);
|
||||||
// TestFXPtr->setLife(32);
|
// TestFXPtr->setLife(32);
|
||||||
CGameScene::dropHealth(Pos,0,0);
|
// CGameScene::dropHealth(Pos,0,0);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
CFX *CFX::Create(const FX_TYPE Type)
|
CFX *CFX::Create(const FX_TYPE Type)
|
||||||
{
|
{
|
||||||
|
@ -261,6 +269,9 @@ CFX *NewFX;
|
||||||
if (!NewFX)
|
if (!NewFX)
|
||||||
switch(Type)
|
switch(Type)
|
||||||
{
|
{
|
||||||
|
case FX_TYPE_NONE:
|
||||||
|
ASSERT(!"FX NONE CANT BE CREATED!");
|
||||||
|
break;
|
||||||
case FX_TYPE_FALLINGTILE:
|
case FX_TYPE_FALLINGTILE:
|
||||||
NewFX=new ("FXFalling Tile") CFXFallingTile();
|
NewFX=new ("FXFalling Tile") CFXFallingTile();
|
||||||
break;
|
break;
|
||||||
|
@ -355,18 +366,12 @@ CFX *NewFX;
|
||||||
NewFX=new ("JellyFish Legs") CFXJellyFishLegs();
|
NewFX=new ("JellyFish Legs") CFXJellyFishLegs();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FX_TYPE_LASER:
|
||||||
|
NewFX=new ("FX Laser") CFXLaser();
|
||||||
|
break;
|
||||||
|
|
||||||
case FX_TYPE_LIGHTNING_BOLT:
|
case FX_TYPE_LIGHTNING_BOLT:
|
||||||
case FX_TYPE_LIGHTNING_SHEET:
|
|
||||||
case FX_TYPE_LIGHTNING_BLAST:
|
|
||||||
case FX_TYPE_LIGHTNING_RADIAL:
|
|
||||||
case FX_TYPE_LIGHTNING_PROJECTILE:
|
|
||||||
case FX_TYPE_SHOCKWAVE:
|
|
||||||
case FX_TYPE_DAZE:
|
case FX_TYPE_DAZE:
|
||||||
|
|
||||||
case FX_TYPE_CASCADE:
|
|
||||||
case FX_TYPE_CASCADE_SPLASH:
|
|
||||||
case FX_TYPE_FIREBALL:
|
|
||||||
|
|
||||||
case FX_TYPE_SMOKE:
|
case FX_TYPE_SMOKE:
|
||||||
case FX_TYPE_GAS:
|
case FX_TYPE_GAS:
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,7 @@ class CFX : public CFXThing
|
||||||
public:
|
public:
|
||||||
enum FX_TYPE
|
enum FX_TYPE
|
||||||
{
|
{
|
||||||
FX_TYPE_JELLYFISH_LEGS, // zero also used to chain fx, so first must be unique type (I know what I mean)
|
FX_TYPE_NONE=0,
|
||||||
FX_TYPE_FALLINGTILE,
|
|
||||||
|
|
||||||
FX_TYPE_EXPLODE,
|
|
||||||
|
|
||||||
FX_TYPE_SPLASH_WATER,
|
FX_TYPE_SPLASH_WATER,
|
||||||
FX_TYPE_SPLASH_ACID,
|
FX_TYPE_SPLASH_ACID,
|
||||||
|
@ -41,23 +38,19 @@ public:
|
||||||
FX_TYPE_THWACK,
|
FX_TYPE_THWACK,
|
||||||
|
|
||||||
FX_TYPE_LIGHTNING_BOLT,
|
FX_TYPE_LIGHTNING_BOLT,
|
||||||
FX_TYPE_LIGHTNING_SHEET,
|
|
||||||
FX_TYPE_LIGHTNING_BLAST,
|
|
||||||
FX_TYPE_LIGHTNING_RADIAL,
|
|
||||||
FX_TYPE_LIGHTNING_PROJECTILE,
|
|
||||||
|
|
||||||
FX_TYPE_SHOCKWAVE,
|
FX_TYPE_SHOCKWAVE,
|
||||||
FX_TYPE_DAZE,
|
FX_TYPE_DAZE,
|
||||||
|
|
||||||
FX_TYPE_CASCADE,
|
|
||||||
FX_TYPE_CASCADE_SPLASH,
|
|
||||||
FX_TYPE_FIREBALL,
|
|
||||||
FX_TYPE_STEAM,
|
FX_TYPE_STEAM,
|
||||||
FX_TYPE_SMOKE,
|
FX_TYPE_SMOKE,
|
||||||
FX_TYPE_GAS,
|
FX_TYPE_GAS,
|
||||||
FX_TYPE_FLAMES,
|
FX_TYPE_FLAMES,
|
||||||
|
|
||||||
|
FX_TYPE_JELLYFISH_LEGS,
|
||||||
|
FX_TYPE_FALLINGTILE,
|
||||||
|
FX_TYPE_EXPLODE,
|
||||||
FX_TYPE_NRG_BAR,
|
FX_TYPE_NRG_BAR,
|
||||||
|
FX_TYPE_LASER,
|
||||||
FX_TYPE_MAX
|
FX_TYPE_MAX
|
||||||
};
|
};
|
||||||
enum
|
enum
|
||||||
|
|
|
@ -80,7 +80,7 @@ void CFXBaseAnim::killFX()
|
||||||
{
|
{
|
||||||
setToShutdown();
|
setToShutdown();
|
||||||
// If has follow on effect, create it now
|
// If has follow on effect, create it now
|
||||||
if (DataPtr->EndFX || canThink())
|
if (DataPtr->EndFX!=CFX::FX_TYPE_NONE && canThink())
|
||||||
{
|
{
|
||||||
CFX::Create((CFX::FX_TYPE)DataPtr->EndFX,getPos());
|
CFX::Create((CFX::FX_TYPE)DataPtr->EndFX,getPos());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*****************/
|
/*************/
|
||||||
/*** Thwack!!! ***/
|
/*** Laser ***/
|
||||||
/*****************/
|
/*************/
|
||||||
|
|
||||||
#include "system\global.h"
|
#include "system\global.h"
|
||||||
#include <DStructs.h>
|
#include <DStructs.h>
|
||||||
|
@ -12,37 +12,78 @@
|
||||||
#include "game\game.h"
|
#include "game\game.h"
|
||||||
#include "gfx\otpos.h"
|
#include "gfx\otpos.h"
|
||||||
|
|
||||||
#include "FX\FXThwack.h"
|
#include "FX\FXLaser.h"
|
||||||
|
|
||||||
const int ThwackLife=12;
|
int LaserWidth=1;
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
void CFXThwack::init(DVECTOR const &_Pos)
|
void CFXLaser::init(DVECTOR const &_Pos)
|
||||||
{
|
{
|
||||||
CFX::init(_Pos);
|
CFX::init(_Pos);
|
||||||
Life=ThwackLife;
|
Life=-1;
|
||||||
OtPos=OTPOS__ACTOR_POS-1;
|
R=G=B=255;
|
||||||
Angle=getRnd()&4095;
|
Offset.vx=Offset.vy=0;
|
||||||
Scale=2048+1024+(getRnd()&2047);
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CFXLaser::setOffset(DVECTOR &Pos)
|
||||||
|
{
|
||||||
|
Offset=Pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CFXLaser::setTarget(DVECTOR &Pos)
|
||||||
|
{
|
||||||
|
Target=Pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*** Think *******************************************************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CFXLaser::think(int _frames)
|
||||||
|
{
|
||||||
|
CThing *Parent=getParent();
|
||||||
|
ASSERT(Parent);
|
||||||
|
|
||||||
|
Pos=Parent->getPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*** Render ******************************************************************/
|
/*** Render ******************************************************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
void CFXLaser::render()
|
||||||
void CFXThwack::render()
|
|
||||||
{
|
{
|
||||||
DVECTOR RenderPos;
|
DVECTOR renderPos0,renderPos1;
|
||||||
|
sOT *ThisOT=OtPtr+OtPos;
|
||||||
|
|
||||||
getFXRenderPos(RenderPos);
|
getFXRenderPos(renderPos0);
|
||||||
if (!canRender() || !IsVisible) return;
|
if (!canRender() || !IsVisible) return;
|
||||||
|
|
||||||
SpriteBank *SprBank=CGameScene::getSpriteBank();
|
calcRenderPos(Target,renderPos1);
|
||||||
POLY_FT4 *Ft4=SprBank->printRotatedScaledSprite(FRM__THWACK,RenderPos.vx,RenderPos.vy,Scale,Scale,Angle,OtPos);
|
renderPos0.vx+=Offset.vx;
|
||||||
setSemiTrans(Ft4,1);
|
renderPos0.vy+=Offset.vy;
|
||||||
Ft4->tpage|=1<<5;
|
// Main Beam
|
||||||
int Col=(256/ThwackLife)*Life;
|
LINE_F2 *L=GetPrimLF2();
|
||||||
setRGB0(Ft4,Col,Col,Col);
|
L->x0=renderPos0.vx; L->y0=renderPos0.vy;
|
||||||
|
L->x1=renderPos1.vx; L->y1=renderPos1.vy;
|
||||||
|
setRGB0(L,R,G,B); addPrim(ThisOT,L);
|
||||||
|
|
||||||
|
// Surround
|
||||||
|
POLY_F4 *P=GetPrimF4();
|
||||||
|
P->x0=renderPos0.vx-LaserWidth; P->y0=renderPos0.vy-LaserWidth;
|
||||||
|
P->x1=renderPos0.vx+LaserWidth; P->y1=renderPos0.vy+LaserWidth;
|
||||||
|
P->x2=renderPos1.vx-LaserWidth; P->y2=renderPos1.vy-LaserWidth;
|
||||||
|
P->x3=renderPos1.vx+LaserWidth; P->y3=renderPos1.vy+LaserWidth;
|
||||||
|
setRGB0(P,R>>1,G>>1,B>>1); addPrim(ThisOT,P);
|
||||||
|
|
||||||
|
//
|
||||||
|
int W=renderPos1.vx-renderPos0.vx;
|
||||||
|
int H=renderPos1.vy-renderPos0.vy;
|
||||||
|
|
||||||
|
if (W<0) W=-W;
|
||||||
|
if (H<0) H=-H;
|
||||||
|
setCollisionCentreOffset(W>>1,H>>1);
|
||||||
|
setCollisionSize(W,H);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,28 @@
|
||||||
/*****************/
|
/*************/
|
||||||
/*** Thwack!!! ***/
|
/*** Laser ***/
|
||||||
/*****************/
|
/*************/
|
||||||
|
|
||||||
#ifndef __FX_FX_THWACK_HEADER__
|
#ifndef __FX_FX_LASER_HEADER__
|
||||||
#define __FX_FX_THWACK_HEADER__
|
#define __FX_FX_LASER_HEADER__
|
||||||
|
|
||||||
#include "fx/fx.h"
|
#include "fx/fx.h"
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
class CFXThwack : public CFX
|
class CFXLaser : public CFX
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual void init(DVECTOR const &Pos);
|
void init(DVECTOR const &Pos);
|
||||||
virtual void render();
|
void think(int _frames);
|
||||||
|
void render();
|
||||||
|
|
||||||
|
void setOffset(DVECTOR &Pos);
|
||||||
|
void setTarget(DVECTOR &Pos);
|
||||||
|
|
||||||
|
void setRGB(u8 r,u8 g,u8 b) {R=r; G=g; B=g;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
u16 Angle,Scale;
|
DVECTOR Offset,Target;
|
||||||
|
u8 R,G,B;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue