Advertisement
ZoriaRPG

Old Somaria WIP Script for TeamUDF

Mar 3rd, 2019
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 20.40 KB | None | 0 0
  1. //ZRPG Edit v0.2
  2. //24MAY2015
  3.  
  4. //Constants
  5. const int WPS_BLOCKPROJECTILE = 93; //The sprite ID to use for the block projectiles' graphics.
  6. const int WPS_BLOCKPUFF = 23; //The sprite ID to use for the block's creation and destruction.
  7. const int WPS_BLANK = 98; //A Sprite ID that is blank.
  8. const int LW_BLOCKPROJECTILE = 154; //The scripted weapon to use for the block projectiles.
  9. const int LW_BLOCKCHECKER = 154; //The scripted weapon used to check for existing blocks.
  10. const int CT_COSBLOCK = 12; //The combo type (Not number) to use for cane of somaria blocks.
  11. const int CT_COSCHANGE1 = 143; //The combo type (Not number) to denote a optional change of direction for the platforms.
  12. const int CT_COSCHANGE2 = 144;//The combo type (Not number) to denote a force change of direction for the platforms.
  13. const int CF_NOCOSBLOCKS = 99; //Flag used to denote that a block cannot be created at this combo.
  14. const int CF_UPLEFT_DOWNRIGHT = 100; //Make this the forced change combo's inherent flag.
  15. const int CF_DOWNLEFT_UPRIGHT = 101; //Make this the forced change combo's inherent flag.
  16.  
  17. const int WSP_FALLING        = 100; //Weapon/Misc. sprite for Link falling down a hole
  18. const int WSP_LAVA            = 101; //Weapon/Misc. sprite for Link drowning in lava
  19. const int SFX_FALLING        = 38; //SFX for falling down a hole
  20. const int SFX_LAVA            = 55; //SFX for drowning in lava=
  21. const int CMB_AUTOWARP        = 7; //Combo ID of a transparent AutoWarp A combotype
  22.  
  23. const int CT_HOLELAVA        = 11; //Combotype to give hole functionality to (default is Left Statue)
  24.  
  25. //Platform array constants.
  26. const int PLATFORM_COMBO_DATA = 15616; //Assign combo of platform to this constant.
  27. const int PLATFORM_DEFAULT_SPEED = 100;
  28. const int PLATFORM_DEFAULT_CSET = 2;
  29.  
  30. const int PLATFORM_DATA = 0;
  31. const int PLATFORM_CSET = 1;
  32. const int PLATFORM_SPEED = 2;
  33. const int PLATFORM_X = 3;
  34. const int PLATFORM_Y = 4;
  35. const int PLATFORM_X_OFFSET = 16;
  36. const int PLAYFORM_Y_OFFSET = 16;
  37.    
  38.    
  39. //Global Variables
  40. int platformscript; //Cane of Somaria platform script.
  41. float platformargs[8]={PLATFORM_COMBO_DATA, PLATFORM_DEFAULT_CSET, PLATFORM_DEFAULT_SPEED, 20,20}; //Cane of Somaria platform script arguments.
  42. int blockarray[4]; //Array that contains the block data.
  43. int combo; //The combo that is currently being effected by the cane of somaria.
  44. int undercombo[3]; //Array used to store the combo underneath the cane of somaria blocks.
  45. int platformdir; //Stores the platform's current direction.
  46. bool usedcane; //Boolean used to determine when the cane has just been used.
  47. bool createplatform; //Boolean used to determine if a platform is to be created instead of a block.
  48. bool onplatform; //Boolean used to determine if Link is on a cane of somaria platform.
  49. bool blockmoving; //Boolean that is true when a block is currently moving.
  50.  
  51. global script Slot2{
  52.         void run(){
  53.                 bool delaying;
  54.         bool scrollinginit;
  55.         int scrollingframes;
  56.         int platformx;
  57.         int platformy;
  58.         int delay;
  59.         onplatform = false;
  60.         platformdir = -1;
  61.         usedcane = false;
  62.                 StartClock();
  63.                 while(true){
  64.                         resetLinkCollision();
  65.                         UpdateGhostZHData();
  66.                         UpdateEWeapons();
  67.                         CleanUpGhostFFCs();
  68.                         Waitdraw();
  69.                         AutoGhost();
  70.                         DrawGhostFFCs();
  71.                         CrystalBlocks();
  72.                         ImmolatedHookshot();
  73.                         DoABWeaponCycling();
  74.                        
  75.                         if(usedcane){
  76.                 if(!delaying){
  77.                     delaying = true;
  78.                     delay = 12;
  79.                 }
  80.                 else if(delay != 0){
  81.                     delay--;
  82.                 }
  83.                 else{
  84.                     delaying = false;
  85.                     if(!BlockExist()){
  86.                          if(createplatform){
  87.                              createplatform = false;
  88.                              lweapon puff = CreateLWeaponAt(LW_SPARKLE,ComboX(combo),ComboY(combo));
  89.                              puff->UseSprite(WPS_BLOCKPUFF);
  90.                              RunFFCScript(platformscript,platformargs);
  91.                              usedcane = false;
  92.                          }
  93.                          else{
  94.                              CreateBlock();
  95.                              usedcane = false;
  96.                          }
  97.                     }
  98.                     else if(FirstComboTypeOf(CT_COSBLOCK,0) != -1){
  99.                         DestroyBlock();
  100.                         usedcane = false;
  101.                     }
  102.                 }
  103.             }
  104.             if(BlockExist()){
  105.                 if(blockmoving && FirstComboTypeOf(CT_COSBLOCK,0) != -1) blockmoving = false;
  106.                 if(!blockmoving) BlockMoved();
  107.             }
  108.             if(onplatform && platformdir >= 0 && Link->Action == LA_SCROLLING) {
  109.                 if(!scrollinginit) {
  110.                     if((platformdir & 2) == 0) {
  111.                         platformx = Link->X;
  112.                         scrollingframes = 40;
  113.                         if(platformdir == DIR_UP) platformy = 0;
  114.                         else platformy = 160;
  115.                     }
  116.                     else {
  117.                         platformy = Link->Y;
  118.                         scrollingframes = 60;
  119.                         if(platformdir == DIR_LEFT) platformx = 0;
  120.                         else platformx = 240;
  121.                     }
  122.                     int ffcindex;
  123.                     ffc newplatform;
  124.                     combo = ComboAt(CenterLinkX(), CenterLinkY());
  125.                     ffcindex = RunFFCScript(platformscript, platformargs);
  126.                     newplatform = Screen->LoadFFC(ffcindex);
  127.                     newplatform->X = ComboX(combo);
  128.                     newplatform->Y = ComboY(combo);
  129.                     scrollinginit = true;
  130.                 }
  131.                 else if(scrollingframes > 0) {
  132.                     if(platformdir == DIR_UP) platformy += 4;
  133.                     else if(platformdir == DIR_DOWN) platformy -= 4;
  134.                     else if(platformdir == DIR_LEFT) platformx += 4;
  135.                     else platformx -= 4;
  136.                     scrollingframes--;
  137.                 }
  138.                 Screen->FastCombo(2, platformx, platformy, platformargs[0], platformargs[1], 128);
  139.             }
  140.             else if(onplatform && platformdir == -1 && FindFFCRunning(platformscript) == 0) {
  141.                 onplatform = false;
  142.                 scrollinginit = false;
  143.             }
  144.             else if(Link->Action != LA_SCROLLING) scrollinginit = false;
  145.                        
  146.                         Waitframe();
  147.                 }
  148.         }
  149. }
  150.  
  151. //Function to check if a block or platform exists.
  152. bool BlockExist(){
  153.     bool exists;
  154.     for(int i = Screen->NumLWeapons(); i > 0; i--){
  155.         lweapon wpn = Screen->LoadLWeapon(i);
  156.         if(wpn->ID == LW_BLOCKCHECKER){
  157.             if(wpn->DeadState == -1) exists = true;
  158.         }
  159.     }
  160.     return(exists);
  161. }
  162.  
  163. //Function to create blocks.
  164. void CreateBlock(){
  165.     if(Screen->ComboS[combo] == 0000b && !ComboFI(combo, CF_NOCOSBLOCKS)) {
  166.         lweapon puff = CreateLWeaponAt(LW_SPARKLE,ComboX(combo),ComboY(combo));
  167.         puff->UseSprite(WPS_BLOCKPUFF);
  168.         lweapon blockchecker = CreateLWeaponAt(LW_BLOCKCHECKER,0,0);
  169.         blockchecker->DeadState = -1;
  170.         blockchecker->UseSprite(WPS_BLANK);
  171.         blockchecker->CollDetection = false;
  172.         while(puff->isValid()) Waitframe();
  173.         StoreUndercombo(combo);
  174.         Screen->ComboD[combo] = blockarray[0];
  175.         Screen->ComboC[combo] = blockarray[1];
  176.         Screen->ComboT[combo] = CT_COSBLOCK;
  177.         Screen->ComboF[combo] = CF_PUSH4WAYINS;
  178.     }
  179. }
  180.  
  181. //Function to destroy blocks.
  182. void DestroyBlock(){
  183.     combo = FirstComboTypeOf(CT_COSBLOCK,0);
  184.     for(int i = 0; i < 4; i++){
  185.         lweapon wpn = CreateLWeaponAt(LW_BLOCKPROJECTILE, ComboX(combo), ComboY(combo));
  186.         wpn->UseSprite(WPS_BLOCKPROJECTILE);
  187.         wpn->Dir = i;
  188.         wpn->Step = blockarray[2];
  189.         if(i == 2 || i == 3) wpn->OriginalTile += wpn->NumFrames;
  190.         if(i == 1) wpn->Flip = 2;
  191.         else if(i == 2) wpn->Flip = 1;
  192.         wpn->Damage = blockarray[3];
  193.     }
  194.     lweapon puff = CreateLWeaponAt(LW_SPARKLE, ComboX(combo), ComboY(combo));
  195.     puff->UseSprite(WPS_BLOCKPUFF);
  196.     lweapon blockchecker = LoadLWeaponOf(LW_BLOCKCHECKER);
  197.     blockchecker->DeadState = WDS_DEAD;
  198.     RestoreUndercombo();
  199. }
  200.  
  201. //Function to set the undercombo beneath blocks
  202. void StoreUndercombo(int position){
  203.     undercombo[0] = Screen->ComboD[position];
  204.     undercombo[1] = Screen->ComboC[position];
  205.     undercombo[2] = Screen->ComboF[position];
  206. }
  207.  
  208. //Function to restore undercombo beneath blocks.
  209. void RestoreUndercombo(){
  210.     Screen->ComboD[combo] = undercombo[0];
  211.     Screen->ComboC[combo] = undercombo[1];
  212.     Screen->ComboF[combo] = undercombo[2];
  213. }
  214.  
  215. //Function to check if the block was pushed this frame.
  216. bool BlockMoved(){
  217.     if(Screen->ComboT[combo] != CT_COSBLOCK){
  218.         RestoreUndercombo();
  219.         if(Link->Dir == DIR_UP) {
  220.             StoreUndercombo(combo - 16);
  221.             combo -= 16;
  222.         }
  223.         else if(Link->Dir == DIR_DOWN) {
  224.             StoreUndercombo(combo + 16);
  225.             combo += 16;
  226.         }
  227.         else if(Link->Dir == DIR_LEFT) {
  228.             StoreUndercombo(combo - 1);
  229.             combo--;
  230.         }
  231.         else if(Link->Dir == DIR_RIGHT) {
  232.             StoreUndercombo(combo + 1);
  233.             combo++;
  234.         }
  235.         blockmoving = true;
  236.         return true;
  237.     }
  238.     else return false;
  239. }
  240.  
  241. void DestroyPlatform() {
  242.    onplatform = false;
  243.    platformdir = -1;
  244.    ffc temp;
  245.    for(int i = 1; i <= 32; i++) {
  246.       temp = Screen->LoadFFC(i);
  247.       if(temp->Script == platformscript) {
  248.          temp->X = 0;
  249.          temp->Y = 0;
  250.          temp->Vx = 0;
  251.          temp->Vy = 0;
  252.          temp->EffectHeight = 16;
  253.          temp->Script = 0;
  254.       }
  255.    }
  256. }
  257.  
  258. bool Falling;
  259. ffc script HoleLava{
  260.     void run(int lava, int warpto, int warptype, int damage){
  261.         int graphic = WSP_FALLING; int sfx = SFX_FALLING;
  262.         if(lava){ graphic = WSP_LAVA; sfx = SFX_LAVA; }
  263.         if(this->X == 0 && this->Y == 0){
  264.             Waitframes(5);
  265.             this->X = Link->X; this->Y = Link->Y;
  266.         }
  267.         if(damage == 0) damage = 8;
  268.    
  269.         while(true){
  270.             while(!OnPitCombo()) Waitframe();
  271.             int pitclk = 0;
  272.             while(OnPitCombo() && pitclk++ < 4) WaitCancelFeather();
  273.             if(pitclk >= 5) Fall(this,sfx,graphic,damage,warpto,warptype);
  274.         }
  275.     }
  276.     void Fall(ffc pos, int sfx, int graphic, int damage, int warpto, int warptype){
  277.         Falling = true;
  278.         Game->PlaySound(sfx);
  279.        
  280.         for(int i=1;i<=Screen->NumLWeapons();i++){
  281.             lweapon l = Screen->LoadLWeapon(i);
  282.             if(l->ID == LW_SWORD) l->DeadState = WDS_DEAD;
  283.         }
  284.        
  285.         int wait = CreateGraphic(graphic);
  286.         Link->CollDetection = false; Link->Invisible = true;
  287.         for(int i=0;i<30;i++) WaitNoAction();
  288.         Link->CollDetection = true; Link->Invisible = false;
  289.  
  290.         if(warpto) Warp(pos, warptype);
  291.  
  292.         Link->X = pos->X; Link->Y = pos->Y;
  293.         Link->HP -= damage;
  294.         Game->PlaySound(SFX_OUCH);
  295.         Falling = false;
  296.     }
  297.     void Warp(ffc Warp, int warptype){
  298.         int orig = Warp->Data;
  299.         Warp->Data = CMB_AUTOWARP+warptype;
  300.         Warp->Flags[FFCF_CARRYOVER] = true;
  301.         Waitframe();
  302.         Warp->Data = orig;
  303.         Warp->Flags[FFCF_CARRYOVER] = false;
  304.         Link->Z = Link->Y;
  305.         Quit();
  306.     }
  307.     bool OnPitCombo(){
  308.         return (Screen->ComboT[ComboAt(Link->X+8,Link->Y+8)] == CT_HOLELAVA && Link->Z <= 0 && Link->Action != LA_FROZEN && !onplatform);
  309.     }
  310.     int CreateGraphic(int sprite){
  311.         lweapon l = Screen->CreateLWeapon(LW_SCRIPT1);
  312.         l->HitXOffset = 500;
  313.         l->UseSprite(sprite);
  314.         l->DeadState = l->NumFrames*l->ASpeed;
  315.         l->X = Link->X; l->Y = Link->Y;
  316.         return l->DeadState;
  317.     }
  318.     void WaitCancelFeather(){
  319.         if(GetEquipmentA() == I_ROCSFEATHER && Link->InputA) Link->InputA = false;
  320.         if(GetEquipmentB() == I_ROCSFEATHER && Link->InputB) Link->InputB = false;
  321.         Waitframe();
  322.     }
  323. }
  324.  
  325.  
  326. //Item Script
  327. item script CaneofSomaria{
  328.     void run(int FAKE, int ffcData, int ffcCSet, int ffcSpeed, int ffcScript, int blockData, int blockCSet, int projectileSpeed){
  329.         usedcane = true;
  330.         DestroyPlatform();
  331.         int linkX = Link->X;
  332.         int linky = Link->Y;
  333.         int platX;
  334.         int platY;
  335.     if ( Link->Dir == DIR_UP ) {
  336.         platX = linkX - PLATFORM_X_OFFSET;
  337.         platY = linkY;
  338.     }
  339.     if ( Link->Dir == DIR_DOWN ) {
  340.         platX = linkX - PLATFORM_X_OFFSET;
  341.         platY = linkY;
  342.     }
  343.     if ( Link->Dir == DIR_LEFT ) {
  344.         platX = linkX;
  345.         platY = linkY - PLATFORM_Y_OFFSET;
  346.     }
  347.     if ( Link->Dir == DIR_RIGHT ) {
  348.         platX = linkX;
  349.         platY = linkY + PLATFORM_Y_OFFSET;
  350.     }
  351.     platformargs[PLATFORM_X] = platX;
  352.     platformargs[PLATFORM_X] = platY;
  353.         if(!BlockExist()){
  354.             if(Screen->ComboT[ComboAt(CenterLinkX() + InFrontX(Link->Dir, 0), CenterLinkY() + InFrontY(Link->Dir, 0))] != CT_DOCK &&
  355.                 Screen->ComboF[ComboAt(CenterLinkX() + InFrontX(Link->Dir, 0), CenterLinkY() + InFrontY(Link->Dir, 0))] == CF_RAFT){
  356.                 createplatform = true;
  357.                 combo = ComboAt(CenterLinkX() + InFrontX(Link->Dir, 0), CenterLinkY() + InFrontY(Link->Dir, 0));
  358.                 platformscript = ffcScript;
  359.                 platformargs[0] = ffcData;
  360.                 platformargs[1] = ffcCSet;
  361.                 platformargs[2] = ffcSpeed;
  362.             }
  363.             else{
  364.                 createplatform = false;
  365.                 combo = ComboAt(CenterLinkX()+ InFrontX(Link->Dir, 0), CenterLinkY() + InFrontY(Link->Dir, 0));
  366.                 blockarray[0] = blockData;
  367.                 blockarray[1] = blockCSet;
  368.                 blockarray[2] = projectileSpeed;
  369.                 blockarray[3] = this->Power;
  370.             }
  371.         }
  372.     }
  373. }
  374.  
  375.  
  376.  
  377. //Platform Script
  378. ffc script COS_Platform{
  379.     void run(int data, int cset, float speed, int locX, int locY){
  380.         this->X = locX;
  381.         this->Y = locY;
  382.         this->Misc[0] = speed;
  383.         if(!onplatform) Start(this);
  384.         else {
  385.            Move(this, platformdir);
  386.            NoAction();
  387.         }
  388.         while(true) {
  389.             if(OnPlatform(this) && Link->Z == 0){
  390.                 Link->X = this->X;
  391.                 Link->Y = this->Y;
  392.             }
  393.             int position = ComboAt(CenterX(this),CenterY(this));
  394.             if(this->X % 16 == 0 && this->Y % 16 == 0){
  395.                 if(Screen->ComboT[position] != CT_DOCK && Screen->ComboF[position] == CF_RAFT){
  396.                     Stop(this);
  397.                 }
  398.                 else if(Screen->ComboT[position] == CT_COSCHANGE1){
  399.                     if(Link->Dir == DIR_UP && platformdir != DIR_DOWN && Screen->ComboF[position - 16] == CF_RAFTBRANCH){
  400.                         Move(this, 0);
  401.                     }
  402.                     else if(Link->Dir == DIR_DOWN && platformdir != DIR_UP && Screen->ComboF[position + 16] == CF_RAFTBRANCH){
  403.                         Move(this, 1);
  404.                     }
  405.                     else if(Link->Dir == DIR_LEFT && platformdir != DIR_RIGHT && Screen->ComboF[position - 1] == CF_RAFTBRANCH){
  406.                         Move(this, 2);
  407.                     }
  408.                     else if(Link->Dir == DIR_RIGHT && platformdir != DIR_LEFT && Screen->ComboF[position + 1] == CF_RAFTBRANCH){
  409.                         Move(this, 3);
  410.                     }
  411.                     else{
  412.                         if(platformdir == 0){
  413.                             if(Screen->ComboF[position - 16] == CF_RAFTBRANCH);
  414.                             else if(Screen->ComboF[position - 1] == CF_RAFTBRANCH) Move(this,2);
  415.                             else if(Screen->ComboF[position + 1] == CF_RAFTBRANCH) Move(this,3);
  416.                             else Stop(this); // If this is done, it's an error on your part.
  417.                         }
  418.                         else if(platformdir == 1){
  419.                             if(Screen->ComboF[position + 16] == CF_RAFTBRANCH);
  420.                             else if(Screen->ComboF[position + 1] == CF_RAFTBRANCH) Move(this,3);
  421.                             else if(Screen->ComboF[position - 1] == CF_RAFTBRANCH) Move(this,2);
  422.                             else Stop(this); // If this is done, it's an error on your part.
  423.                         }
  424.                         else if(platformdir == 2){
  425.                             if(Screen->ComboF[position - 1] == CF_RAFTBRANCH);
  426.                             else if(Screen->ComboF[position - 16] == CF_RAFTBRANCH) Move(this,0);
  427.                             else if(Screen->ComboF[position + 16] == CF_RAFTBRANCH) Move(this,1);
  428.                             else Stop(this); // If this is done, it's an error on your part.
  429.                         }
  430.                         else if(platformdir == 3){
  431.                             if(Screen->ComboF[position + 1] == CF_RAFTBRANCH);
  432.                             else if(Screen->ComboF[position + 16] == CF_RAFTBRANCH) Move(this,1);
  433.                             else if(Screen->ComboF[position - 16] == CF_RAFTBRANCH) Move(this,0);
  434.                             else Stop(this); // If this is done, it's an error on your part.
  435.                         }
  436.                     }
  437.                 }
  438.                 else if(Screen->ComboT[position] == CT_COSCHANGE2){
  439.                     if(Screen->ComboI[position] == CF_UPLEFT_DOWNRIGHT) Move(this, platformdir ^ 10b);
  440.                     else if(Screen->ComboI[position] == CF_DOWNLEFT_UPRIGHT) Move(this, platformdir ^ 11b);
  441.                 }
  442.                 else if(Screen->ComboF[position] == 103) Move(this, platformdir ^ 1b);
  443.             }
  444.             if(this->X <= -16 || this->X >= 256 || this->Y <= -16 || this->Y >= 176) break;
  445.             Screen->FastCombo(2, this->X, this->Y, data, cset, 128);
  446.             Waitframe();
  447.         }
  448.         DestroyPlatform();
  449.     }
  450.     void Start(ffc platform){
  451.         while(platform->Vx == 0 && platform->Vy == 0){
  452.             if(OnPlatform(platform)) {
  453.                 if(Link->PressUp && Screen->ComboF[ComboAt(CenterX(platform), CenterY(platform)) - 16] == CF_RAFTBRANCH){
  454.                     Move(platform, 0);
  455.                 }
  456.                 else if(Link->PressDown && Screen->ComboF[ComboAt(CenterX(platform), CenterY(platform)) + 16] == CF_RAFTBRANCH){
  457.                     Move(platform, 1);
  458.                 }
  459.                 else if(Link->PressLeft && Screen->ComboF[ComboAt(CenterX(platform), CenterY(platform)) - 1] == CF_RAFTBRANCH){
  460.                     Move(platform,2);
  461.                 }
  462.                 else if(Link->PressRight && Screen->ComboF[ComboAt(CenterX(platform), CenterY(platform)) + 1] == CF_RAFTBRANCH){
  463.                     Move(platform, 3);
  464.                 }
  465.             }
  466.             Screen->FastCombo(2, platform->X, platform->Y, platformargs[0], platformargs[1], 128);
  467.             Waitframe();
  468.         }
  469.     }
  470.     void Stop(ffc platform){
  471.         platform->Vx = 0;
  472.         platform->Vy = 0;
  473.         platform->EffectHeight = 16;
  474.         platformdir = -1;
  475.         Start(platform);
  476.     }
  477.     void Move(ffc platform, int direction){
  478.         if(direction == 0){
  479.             platform->Vx = 0;
  480.             platform->Vy = platform->Misc[0] * -1;
  481.         }
  482.         else if(direction == 1){
  483.             platform->Vx = 0;
  484.             platform->Vy = platform->Misc[0];
  485.         }
  486.         else if(direction == 2){
  487.             platform->Vx = platform->Misc[0] * -1;
  488.             platform->Vy = 0;
  489.         }
  490.         else if(direction == 3){
  491.             platform->Vx = platform->Misc[0];
  492.             platform->Vy = 0;
  493.         }
  494.         platform->EffectHeight = 20;
  495.         platformdir = direction;
  496.         if(onplatform && Link->Z == 0) {
  497.            Link->X = platform->X;
  498.            Link->Y = platform->Y;
  499.         }
  500.     }
  501.     bool OnPlatform(ffc platform){
  502.         if(CenterLinkX() >= platform->X && CenterLinkX() <= (platform->X + (platform->TileWidth * 16)) &&
  503.                CenterLinkY() >= platform->Y && CenterLinkY() <= (platform->Y + (platform->TileHeight * 16))) onplatform = true;
  504.         else onplatform = false;
  505.         return onplatform;
  506.     }
  507.  
  508.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement