Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.77 KB | None | 0 0
  1. import "std.zh"
  2. import "ghost.zh"
  3. import "string.zh"
  4.  
  5. //Global Variables
  6.  
  7. int TimesContinued;//Tracks how many times you've continued.
  8.  
  9. global script Active{
  10. void run(){
  11. //Increases variable when you F6.
  12. //Used to prevent cheating past spinners.
  13. TimesContinued++;
  14. }
  15. }
  16.  
  17. global script OnContinue{
  18. void run(){
  19. //Increases variable when you load the game after saving.
  20. //Used to prevent cheating past spinners.
  21. TimesContinued++;
  22. }
  23. }
  24.  
  25. global script OnExit{
  26. void run(){
  27. TimesContinued++;
  28. }
  29. }
  30.  
  31.  
  32. //Test if one location is between two others.
  33. //D0- Location to test
  34. //D1- Lower bound
  35. //D2- Higher bound
  36.  
  37. bool Between(int loc,int greaterthan, int lessthan){
  38. if(loc>=greaterthan && loc<=lessthan)return true;
  39. return false;
  40. }
  41.  
  42. //Floor Spinner
  43.  
  44. const int FLOOR_SPINNER_SFX = 78;//Sound made by spinner.
  45. const int FLOOR_SPINNER_REST_COMBO = 29620;//Counterclockwise spinner at rest.
  46. //Clockwise is one more.
  47. const int FLOOR_SPINNER_BASE_COMBO = 29622;//Base of spinner with counterclockwise lights.
  48. //Clockwise is one more.
  49. const int SPINNER_CSET = 8;//Cset used by spinner.
  50.  
  51. ffc script Floor_Spinner{
  52. void run(bool Clockwise,int perm, int lw){
  53. this->Flags[FFCF_IGNOREHOLDUP]= true;
  54. int SpinDestination;//Determines destination.
  55. float angle;//Handles rotation.
  56. //Controls spin phase.
  57. bool Spinning = false;
  58. bool HasSpun;//Tells the script if this spinner has already spun.
  59. bool TimeStored = false;//Tells script if Screen->D zero has already been altered.
  60. bool DirSwitched = false;//Tells if this script's direction of movement has been switched.
  61. //If nothing is stored in Screen->D zero.
  62. if(!TimeStored && Screen->D[0]==0){
  63. //Alter it to match times you've continued.
  64. Screen->D[0]= TimesContinued;
  65. //Make it never do this again.
  66. TimeStored= true;
  67. }
  68. //Screen->D zero has a value in it.
  69. else{
  70. //Screen->D zero is not equal to the global variable.
  71. if(Screen->D[0]!=TimesContinued){
  72. //Change it to be equal to the global variable.
  73. Screen->D[0]= TimesContinued;
  74. //Reset the spinner.
  75. Screen->D[perm]= 0;
  76. }
  77. }
  78. //Based on current value of the register, determine if this spinner has already spun.
  79. if(Screen->D[perm]==0)HasSpun = false;
  80. else HasSpun= true;
  81. //Change appearance accordingly.
  82. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun))
  83. this->Data = FLOOR_SPINNER_REST_COMBO+1;
  84. else if((Clockwise && HasSpun)||(!Clockwise && !HasSpun))
  85. this->Data = FLOOR_SPINNER_REST_COMBO;
  86. while(true){
  87. for(int i= Screen->NumLWeapons();i>0;i--){
  88. lweapon l = Screen->LoadLWeapon(i);
  89. if(l->ID==lw && Collision(this,l))
  90. DirSwitched = true;
  91. }
  92. //First time visiting with a clockwise or already visited CCW.
  93. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun)){
  94. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  95. ///Approach from top.
  96. if(Between(Link->X,this->X+2,this->X+(this->TileWidth*16)-2) &&
  97. Between(Link->Y+16,this->Y+2,this->Y+8) &&
  98. Between(Link->X+16,this->X+2,this->X+(this->TileWidth*16)-2)){
  99. //Go to right.
  100. SpinDestination = 1;
  101. //Start spin phase.
  102. Spinning = true;
  103. }
  104. //Approach from bottom.
  105. else if(Between(Link->X,this->X+2,this->X+(this->TileWidth*16)-2) &&
  106. Between(Link->Y,this->Y+24,this->Y+(this->TileHeight*16)-2) &&
  107. Between(Link->X+16,this->X+2,this->X+(this->TileWidth*16)-2)){
  108. //Go to left.
  109. SpinDestination = 3;
  110. Spinning = true;
  111. }
  112. //Approach from left.
  113. else if(Between(Link->Y,this->Y+2,this->Y+(this->TileHeight*16)-2) &&
  114. Between(Link->Y+16,this->Y+2,this->Y+(this->TileHeight*16)-2) &&
  115. Between(Link->X+16,this->X+2,this->X+(this->TileWidth*16)-2)){
  116. //Go to top.
  117. SpinDestination = 0;
  118. Spinning = true;
  119. }
  120. //Approach from right.
  121. else if(Between(Link->Y,this->Y+2,this->Y+(this->TileHeight*16)-2) &&
  122. Between(Link->Y+16,this->Y+2,this->Y+(this->TileHeight*16)-2) &&
  123. Between(Link->X,this->X+24,this->X+(this->TileWidth*16)-2)){
  124. //Go to bottom.
  125. SpinDestination = 2;
  126. Spinning = true;
  127. }
  128. }
  129. //Return to clockwise or first time visited CCW.
  130. else if((Clockwise && HasSpun)||(!Clockwise && !HasSpun)){
  131. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  132. //Approach from top.
  133. if(Between(Link->X,this->X+2,this->X+(this->TileWidth*16)-2) &&
  134. Between(Link->Y+16,this->Y+2,this->Y+8) &&
  135. Between(Link->X+16,this->X+2,this->X+(this->TileWidth*16)-2)){
  136. //Go to left.
  137. SpinDestination = 2;
  138. Spinning = true;
  139. }
  140. //Approach from bottom.
  141. else if(Between(Link->X,this->X+2,this->X+(this->TileWidth*16)-2) &&
  142. Between(Link->Y,this->Y+24,this->Y+(this->TileHeight*16)-2) &&
  143. Between(Link->X+16,this->X+2,this->X+(this->TileWidth*16)-2)){
  144. //Go to right.
  145. SpinDestination = 1;
  146. Spinning = true;
  147. }
  148. //Approach from left.
  149. else if(Between(Link->Y,this->Y+2,this->Y+(this->TileHeight*16)-2) &&
  150. Between(Link->Y+16,this->Y+2,this->Y+(this->TileHeight*16)-2) &&
  151. Between(Link->X+16,this->X+2,this->X+(this->TileWidth*16)-2)){
  152. //Go to bottom
  153. SpinDestination = 3;
  154. Spinning = true;
  155. }
  156. //Approach from right.
  157. else if(Between(Link->Y,this->Y+2,this->Y+(this->TileHeight*16)-2) &&
  158. Between(Link->Y+16,this->Y+2,this->Y+(this->TileHeight*16)-2) &&
  159. Between(Link->X,this->X+24,this->X+(this->TileWidth*16)-2)){
  160. //Go to top.
  161. SpinDestination = 0;
  162. Spinning = true;
  163. }
  164. }
  165. //Time to spin now.
  166. if(Spinning){
  167. //First time on a clockwise spinner or return to a counterclockwise spinner.
  168. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun)){
  169. //From left to top.
  170. if(SpinDestination ==0){
  171. //Set starting position.
  172. angle = 180;
  173. while(angle<270){
  174. //Make the ffc invisible.
  175. //You don't have to use the ghost.zh invisible combo, I just find it easier.
  176. this->Data= GH_INVISIBLE_COMBO;
  177. //Keep Link immobile.
  178. NoAction();
  179. //Handles rotation.
  180. angle= (angle+2)%360;
  181. //Draw combos corresponding to the spinner's appearance and rotate them.
  182. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  183. Screen->DrawCombo(2, this->X, this->Y, FLOOR_SPINNER_REST_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, this->X, this->Y, angle, 1, -1, true, 128);
  184. //Play a sound.
  185. Game->PlaySound(FLOOR_SPINNER_SFX);
  186. //Rotate Link.
  187. Link->X = (this->X+16)+ 20 * Cos(angle);
  188. Link->Y = (this->Y+16)+ 20 * Sin(angle);
  189. Waitframe();
  190. }
  191. //If this spinner hadn't spun before...
  192. if(!HasSpun){
  193. //Set Screen->D register.
  194. Screen->D[perm]= 1;
  195. //Change variable.
  196. HasSpun = true;
  197. }
  198. //This spinner has spun before.
  199. else if(HasSpun){
  200. Screen->D[perm]= 0;
  201. HasSpun = false;
  202. }
  203. //Reset ffc to visible.
  204. this->Data = FLOOR_SPINNER_REST_COMBO;
  205. //Handles leaving spinner.
  206. SpinnerExit(DIR_UP,this,Clockwise,HasSpun);
  207. Spinning = false;
  208. }
  209. //From top to right.
  210. else if(SpinDestination ==1){
  211. angle = 270;
  212. while(angle!=0){
  213. this->Data= GH_INVISIBLE_COMBO;
  214. NoAction();
  215. angle= (angle+2)%360;
  216. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  217. Screen->DrawCombo(2, this->X, this->Y, FLOOR_SPINNER_REST_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, this->X, this->Y, angle, 1, -1, true, 128);
  218. Game->PlaySound(FLOOR_SPINNER_SFX);
  219. Link->X = (this->X+16)+ 20 * Cos(angle);
  220. Link->Y = (this->Y+16)+ 20 * Sin(angle);
  221. Waitframe();
  222. }
  223. if(!HasSpun){
  224. Screen->D[perm]= 1;
  225. HasSpun = true;
  226. }
  227. else if(HasSpun){
  228. Screen->D[perm]= 0;
  229. HasSpun = false;
  230. }
  231. this->Data = FLOOR_SPINNER_REST_COMBO;
  232. SpinnerExit(DIR_RIGHT,this,Clockwise,HasSpun);
  233. Spinning = false;
  234. }
  235. //From right to bottom.
  236. else if(SpinDestination ==2){
  237. angle = 0;
  238. while(angle<90){
  239. this->Data= GH_INVISIBLE_COMBO;
  240. NoAction();
  241. angle= (angle+2)%360;
  242. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  243. Screen->DrawCombo(2, this->X, this->Y, FLOOR_SPINNER_REST_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, this->X, this->Y, angle, 1, -1, true, 128);
  244. Game->PlaySound(FLOOR_SPINNER_SFX);
  245. Link->X = (this->X+16)+ 20 * Cos(angle);
  246. Link->Y = (this->Y+16)+ 20 * Sin(angle);
  247. Waitframe();
  248. }
  249. if(!HasSpun){
  250. Screen->D[perm]= 1;
  251. HasSpun = true;
  252. }
  253. else if(HasSpun){
  254. Screen->D[perm]= 0;
  255. HasSpun = false;
  256. }
  257. this->Data = FLOOR_SPINNER_REST_COMBO;
  258. SpinnerExit(DIR_DOWN,this,Clockwise,HasSpun);
  259. Spinning = false;
  260. }
  261. //From bottom to left.
  262. else if(SpinDestination ==3){
  263. angle = 90;
  264. while(angle<180){
  265. this->Data= GH_INVISIBLE_COMBO;
  266. NoAction();
  267. angle= (angle+2)%360;
  268. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  269. Screen->DrawCombo(2, this->X, this->Y, FLOOR_SPINNER_REST_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, this->X, this->Y, angle, 1, -1, true, 128);
  270. Game->PlaySound(FLOOR_SPINNER_SFX);
  271. Link->X = (this->X+16)+ 20 * Cos(angle);
  272. Link->Y = (this->Y+16)+ 20 * Sin(angle);
  273. Waitframe();
  274. }
  275. if(!HasSpun){
  276. Screen->D[perm]= 1;
  277. HasSpun = true;
  278. }
  279. else if(HasSpun){
  280. Screen->D[perm]= 0;
  281. HasSpun = false;
  282. }
  283. this->Data = FLOOR_SPINNER_REST_COMBO;
  284. SpinnerExit(DIR_LEFT,this,Clockwise,HasSpun);
  285. Spinning = false;
  286. }
  287. }
  288. //Return to a clockwise spinner that has spun, or first visit to a counterclockwise spinner.
  289. else if((Clockwise && HasSpun)||(!Clockwise && !HasSpun)){
  290. //From right to top.
  291. if(SpinDestination ==0){
  292. angle = 360;
  293. while(angle>270){
  294. this->Data= GH_INVISIBLE_COMBO;
  295. NoAction();
  296. angle= (angle-2)%360;
  297. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  298. Screen->DrawCombo(2, this->X, this->Y, FLOOR_SPINNER_REST_COMBO, 3, 3, SPINNER_CSET, -1,-1, this->X, this->Y, angle, 1, -1, true, 128);
  299. Game->PlaySound(FLOOR_SPINNER_SFX);
  300. Link->X = (this->X+16)+ 20 * Cos(angle);
  301. Link->Y = (this->Y+16)+ 20 * Sin(angle);
  302. Waitframe();
  303. }
  304. if(!HasSpun){
  305. Screen->D[perm]= 1;
  306. HasSpun = true;
  307. }
  308. else if(HasSpun){
  309. Screen->D[perm]= 0;
  310. HasSpun = false;
  311. }
  312. this->Data = FLOOR_SPINNER_REST_COMBO+1;
  313. SpinnerExit(DIR_UP,this,Clockwise,HasSpun);
  314. Spinning = false;
  315. }
  316. //From bottom to right.
  317. else if(SpinDestination ==1){
  318. angle = 90;
  319. while(angle>0){
  320. this->Data= GH_INVISIBLE_COMBO;
  321. NoAction();
  322. angle= (angle-2)%360;
  323. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  324. Screen->DrawCombo(2, this->X, this->Y, FLOOR_SPINNER_REST_COMBO, 3, 3, SPINNER_CSET, -1,-1, this->X, this->Y, angle, 1, -1, true, 128);
  325. Game->PlaySound(FLOOR_SPINNER_SFX);
  326. Link->X = (this->X+16)+ 20 * Cos(angle);
  327. Link->Y = (this->Y+16)+ 20 * Sin(angle);
  328. Waitframe();
  329. }
  330. if(!HasSpun){
  331. Screen->D[perm]= 1;
  332. HasSpun = true;
  333. }
  334. else if(HasSpun){
  335. Screen->D[perm]= 0;
  336. HasSpun = false;
  337. }
  338. this->Data = FLOOR_SPINNER_REST_COMBO+1;
  339. SpinnerExit(DIR_RIGHT,this,Clockwise,HasSpun);
  340. Spinning = false;
  341. }
  342. //From top to left.
  343. else if(SpinDestination ==2){
  344. angle = 270;
  345. while(angle>180){
  346. this->Data= GH_INVISIBLE_COMBO;
  347. NoAction();
  348. angle= (angle-2)%360;
  349. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  350. Screen->DrawCombo(2, this->X, this->Y, FLOOR_SPINNER_REST_COMBO, 3, 3, SPINNER_CSET, -1,-1, this->X, this->Y, angle, 1, -1, true, 128);
  351. Game->PlaySound(FLOOR_SPINNER_SFX);
  352. Link->X = (this->X+16)+ 20 * Cos(angle);
  353. Link->Y = (this->Y+16)+ 20 * Sin(angle);
  354. Waitframe();
  355. }
  356. if(!HasSpun){
  357. Screen->D[perm]= 1;
  358. HasSpun = true;
  359. }
  360. else if(HasSpun){
  361. Screen->D[perm]= 0;
  362. HasSpun = false;
  363. }
  364. this->Data = FLOOR_SPINNER_REST_COMBO+1;
  365. SpinnerExit(DIR_LEFT,this,Clockwise,HasSpun);
  366. Spinning = false;
  367. }
  368. //From left to bottom
  369. else if(SpinDestination ==3){
  370. angle = 180;
  371. while(angle>90){
  372. this->Data= GH_INVISIBLE_COMBO;
  373. NoAction();
  374. angle= (angle-2)%360;
  375. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  376. Screen->DrawCombo(2, this->X, this->Y, FLOOR_SPINNER_REST_COMBO, 3, 3, SPINNER_CSET, -1,-1, this->X, this->Y, angle, 1, -1, true, 128);
  377. Game->PlaySound(FLOOR_SPINNER_SFX);
  378. Link->X = (this->X+16)+ 20 * Cos(angle);
  379. Link->Y = (this->Y+16)+ 20 * Sin(angle);
  380. Waitframe();
  381. }
  382. if(!HasSpun){
  383. Screen->D[perm]= 1;
  384. HasSpun = true;
  385. }
  386. else if(HasSpun){
  387. Screen->D[perm]= 0;
  388. HasSpun = false;
  389. }
  390. this->Data = FLOOR_SPINNER_REST_COMBO+1;
  391. SpinnerExit(DIR_DOWN,this,Clockwise,HasSpun);
  392. Spinning = false;
  393. }
  394. }
  395. }
  396. if(DirSwitched){
  397. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun)){
  398. if(!HasSpun){
  399. //Set Screen->D register.
  400. Screen->D[perm]= 1;
  401. //Change variable.
  402. HasSpun = true;
  403. }
  404. //This spinner has spun before.
  405. else if(HasSpun){
  406. Screen->D[perm]= 0;
  407. HasSpun = false;
  408. }
  409. //Reset ffc to visible.
  410. this->Data = FLOOR_SPINNER_REST_COMBO;
  411. DirSwitched = false;
  412. }
  413. else if((!Clockwise && HasSpun)||(Clockwise && !HasSpun)){
  414. if(!HasSpun){
  415. Screen->D[perm]= 1;
  416. HasSpun = true;
  417. }
  418. else if(HasSpun){
  419. Screen->D[perm]= 0;
  420. HasSpun = false;
  421. }
  422. this->Data = FLOOR_SPINNER_REST_COMBO+1;
  423. DirSwitched = false;
  424. }
  425. Game->PlaySound(SFX_SECRET);
  426. }
  427. Waitframe();
  428. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun))
  429. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  430. else if((Clockwise && HasSpun)||(!Clockwise && !HasSpun))
  431. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  432. }
  433. }
  434. //Handles exiting spinner.
  435. //Based on direction, makes Link walk that way for 10 frames and be unable to do anything else.
  436. void SpinnerExit (int dir,ffc this, bool Clockwise, bool HasSpun){
  437. if (dir == DIR_UP){
  438. for (int i = 0; i < 10; i++){
  439. NoAction();
  440. Link->InputUp = true;
  441. Waitframe();
  442. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun))
  443. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  444. else if((Clockwise && HasSpun)||(!Clockwise && !HasSpun))
  445. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  446. }
  447. }
  448. else if (dir == DIR_DOWN){
  449. for (int i = 0; i < 10; i++){
  450. NoAction();
  451. Link->InputDown = true;
  452. Waitframe();
  453. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun))
  454. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  455. else if((Clockwise && HasSpun)||(!Clockwise && !HasSpun))
  456. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  457. }
  458. }
  459. else if (dir == DIR_LEFT){
  460. for (int i = 0; i < 10; i++){
  461. NoAction();
  462. Link->InputLeft = true;
  463. Waitframe();
  464. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun))
  465. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  466. else if((Clockwise && HasSpun)||(!Clockwise && !HasSpun))
  467. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  468. }
  469. }
  470. else if (dir == DIR_RIGHT){
  471. for (int i = 0; i < 10; i++){
  472. NoAction();
  473. Link->InputRight = true;
  474. Waitframe();
  475. if((Clockwise && !HasSpun)||(!Clockwise && HasSpun))
  476. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  477. else if((Clockwise && HasSpun)||(!Clockwise && !HasSpun))
  478. Screen->DrawCombo(1, this->X, this->Y, FLOOR_SPINNER_BASE_COMBO+1, 3, 3, SPINNER_CSET, -1,-1, 0, 0, 0, 1, -1, true, 128);
  479. }
  480. }
  481. }
  482. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement