Downloads containing xlmmonopoly.j2as

Downloads
Name Author Game Mode Rating
JJ2+ Only: JazzopolyFeatured Download Superjazz Custom / Concept 9 Download file

File preview

  1. //http://www.hasbro.de/manuals/15283i09text.pdf
  2. //http://en.wikibooks.org/wiki/Monopoly/Official_Rules
  3.  
  4. //*** Jazzopoly ***//
  5. //*** Written by Vivando/CJ ***//
  6. //*** An scripted level dedicated to XLM ***//
  7. //*** This level is not an attempt to make a real Monopoly game, but it uses the same concept. Therefore it's called Jazzopoly ***//
  8. //*** Instead it uses fictional Jazz-themed places and events to personalize the game in a custom way ***//
  9. //*** Thus not all the rules are exactly the same as in monopoly, and the board is only 20 tiles("squares") big ***//
  10. //*** Special thanks to Sir Ementaler for the textured BG fix and for general guiding ***//
  11. //*** Special thanks to PurpleJazz and TreyLina for testing ***//
  12. //*** This level pays tribute to Monopoly by URJazz ***//
  13. //*** Yeah, some of the property-names were unadventurously recycled from monopoly2.j2l ***//
  14.  
  15. //*OBJECT DECLARATION*//
  16. Dice dice;
  17.  
  18. array<Square> squares = {
  19. Square(0, -2, 0, 0, 0, "||||START", 0), //-1 = no owner, -2 = non-buyable
  20. Square(1, -1, 20, 16, 8, "Diamondus Drive", 1),
  21. Square(2, -1, 25, 20, 10, "Lagunicus Lowland", 1),
  22. Square(3, -2, 0, 0, 0, "||||CHANCE", 0),
  23. Square(4, -1, 30, 24, 12, "Letni Loop", 1),
  24. Square(5, -2, 0, 0, 0, "||||JAIL", 0),
  25. Square(6, -1, 40, 32, 16, "Raneforus Road", 1),
  26. Square(7, -1, 45, 36, 18, "Exoticus Avenue", 1),
  27. Square(8, -2, 0, 0, 0, "||||COMMUNITY CHEST", 0),
  28. Square(9, -1, 50, 40, 20, "Muckamok Marsh", 1),
  29. Square(10, -2, 0, 0, 0, "||||FREE PARKING", 0),
  30. Square(11, -1, 60, 48, 24, "Ceramicus Corner", 1),
  31. Square(12, -1, 65, 52, 26, "Stonar Subway", 1),
  32. Square(13, -2, 0, 0, 0, "||||CHANCE", 0),
  33. Square(14, -1, 70, 56, 28, "Scraparap Street", 1),
  34. Square(15, -2, 0, 0, 0, "||||GO TO JAIL!", 0),
  35. Square(16, -1, 80, 64, 32, "Industrius Section", 1),
  36. Square(17, -1, 85, 68, 34, "Deserto Downtown", 1),
  37. Square(18, -2, 0, 0, 0, "||||COMMUNITY CHEST", 0),
  38. Square(19, -1, 100, 80, 40, "Holidaius Hills", 1)
  39. };
  40.  
  41. array<PlayerLoc> players(4);
  42.  
  43. //*END OF OBJECT DECLARATION*//
  44.  
  45. //*OTHER DECLARATIONS*//
  46.  
  47. enum packet_type {packet_turnStart, packet_turnFinish, packet_turnSkip, packet_move, packet_signupReq, packet_signupResp,
  48. packet_signupAnn, packet_dice, packet_rent, packet_buy, packet_sell, packet_idRequest, packet_jail, packet_jailbreak,
  49. packet_jailAvoid, packet_chance, packet_cc, packet_elim, packet_noThrow, packet_wildCard, packet_wildCardUse,
  50. packet_coin, packet_firstPlayer, packet_gameStart, packet_option1, packet_option2, packet_registered, packet_cc2,
  51. packet_rentChange, packet_freeProperty, packet_spaceTroll, packet_endGame, packet_players, packet_gameEnding, packet_gameCancel}; //for network communication
  52.  
  53. enum page {page_blank, page_preAction, page_postAction, page_buyable, page_wildCard, page_jailMoney, page_spaceTroll};
  54.  
  55. bool inGame = false; //to check whether the player is signed up for the game
  56. bool isInBox = false; //the box in the center
  57. bool doTurn = false;
  58. bool isTurn = false; //determines whether the current player has it's turn
  59. bool hasThrown = false; //whether the player has thrown the dice
  60. bool diceRolls = false;
  61. bool printDice = false;
  62. bool playerMoves = false; //moves the player tile by tile
  63. bool playerMovesBack = false; //moves the player tile by tile backwards (chance)
  64. bool playerMovesQuick = false; //gotta go fast!
  65. bool playerMovesBackQuick = false;
  66. bool finishedMoving = false; //to true once playerMoves ends
  67. bool confirmed = true; //to true once player throws the dice or performs a square action, initial value true so that player can't sign up before security check, see level pos. 4-6,2
  68. bool diceConfirmed = false;
  69. bool buyable = false;
  70. bool bought = false;
  71. bool requestJailMoney = false;
  72. bool giveCoins = false; //increment coins
  73. bool takeCoins = false; //deduct coins
  74. bool drawBackground = true; //draw transparent background when the level is loaded
  75. bool drawMark = false; //question mark for chance
  76. bool printSquare = false;
  77. bool printChance = false;
  78. bool printCC = false;
  79. bool printReward = false;
  80. bool printOK = false;
  81. bool gameRuns = false; //shortcut for game states
  82. bool gameStarted = false; //player can no longer sign up once true
  83. bool gameEnded = false;
  84. bool waitForFinish = false; //to true once player has performed his turn, waiting 3 seconds before sending turn finish packet
  85. //bool hasSelected = false; //remove this part for final version
  86. bool selectYes = true; //a player has selection on "Yes" by default when choosing whether to buy property or not
  87. bool selectView = false;
  88. bool preAction = false; //page shown once the player turn begins
  89. bool midAction = false; //page shown before postAction if necessary
  90. bool postAction = false; //page shown after the player performed moving and square action
  91. bool postTurn = false;
  92. bool promptWildCard = false;
  93. bool isThrowing = false;
  94. bool viewMap = false;
  95. bool selling = false;
  96. bool upgrading = false;
  97. bool confirmation = false;
  98. bool keyFireReleased = true;
  99. bool waitForChance = false;
  100. bool waitForCC = false;
  101. bool waitForMove = false; //for little delay between printing chance texts and the moved square texts
  102. bool waitForMoveForward = false;
  103. bool waitForMoveBack = false;
  104. bool waitForMoveQuick = false;
  105. bool waitForSelect = false;
  106. bool waitForWildCard = false;
  107. bool switched = false;
  108. //bool inChance = true;
  109. bool isJailed = false; //for checking whether the player is jailed or not in general
  110. bool isNotInJail = false; //for checking whether or not the player is already in jail at the event of wild card use
  111. bool firstPlayer = false;
  112. bool initiateTurn = true;
  113. bool zeroReleased = true;
  114. bool spaceTroll = false;
  115. bool firstTime = true; //first game start for the server
  116.  
  117. string turnTimer;
  118. string squareFunction = ""; //the first string describing the square ownership
  119. string squareAction = ""; //the second string describing the action the player may or must take
  120. string squarePrice = ""; //only displayed if the player doesn't have enough money to buy a property
  121. string c1 = "";
  122. string c2 = "";
  123. string c3 = "";
  124.  
  125. uint8 requestedPage = 0;
  126. uint8 animFrame = 0;
  127. uint selectionPos = 0;
  128. uint confirmationPos = 0;
  129.  
  130. int8 yourPlayerNo = -1;
  131. int8 turnTimeLimitInt = 6;
  132. int8 playersLeft = 0;
  133. int8 playerTurn = 4;
  134. int8 currentTurn = 4;
  135. int8 turnCounter = 1;
  136.  
  137. int lastThrownNumber = 1;
  138. int toMove = 0; //copied from lastThrownNumber in default case (throw dice), but used also from chance-events so that it doesn't affect lastThrownNumber
  139. int toSquare = 0;
  140. int diceElapsed = 0; //for how long the dice "rolls"
  141. int moveElapsed = 1; //for how long the player moves
  142. int turnElapsed = 0; //for how long the turn lasts
  143. int roundElapsed = 0;
  144. int coinElapsed = 1;
  145. int coinFinal = 0;
  146. int rewardElapsed = 0;
  147. int buyElapsed = 0;
  148. int jailElapsed = 0;
  149. int playerSquare = 0;
  150. int currSquare = 0; //used for moving the player in the first place
  151. int squareID = -1;
  152. int registered = 0; //to be incremented when a player is signed up for the game
  153. int currentChance = 0;
  154. int currentCC = 0;
  155. int wait = 0; //waiter-variable before finishing a player's turn
  156. //int enteredInt = 1; //remove this part for final version
  157. int diceWait = 0;
  158. int returnWait = 0;
  159. int viewWait = 0;
  160. int chanceWait = 0;
  161. int ccWait = 0;
  162. int moveWait = 0;
  163. int selectWait = 0;
  164. int wildCardWait = 0;
  165. int marky = 0; //question mark's y position
  166. int markIni = 336; //initial mark location on y axis
  167. int markFinal = 236; //final location
  168. int turnDelay = 420;
  169. int round = 0;
  170. int roundLimit = 0;
  171. int roundLimitInt = 6;
  172. int M = 60; //amount of minutes
  173. int S = 0;  //amount of seconds
  174. int timer = (M * 60 + S) * 70; //timer structure
  175. int maxTime = (M * 60 + S) * 70; //used for timing the turns
  176. int statsMode = 1;
  177.  
  178. const array<int> squarex = {33, 28, 23, 18, 13, 8, 8, 8, 8, 8, 8, 13, 18, 23, 28, 33, 33, 33, 33, 33};
  179. const array<int> squarey = {34, 34, 34, 34, 34, 34, 29, 24, 19, 14, 9, 9, 9, 9, 9, 9, 14, 19, 24, 29};
  180. const array<int> minutesArray = {0, 0, 1, 1, 2, 5, 60}; //the last stands for unlimited
  181. const array<int> secondsArray = {30, 45, 0, 30, 0, 0, 0};
  182. const array<int> roundsArray = {1, 25, 40, 60, 80, 100, 0};
  183.  
  184. array<uint> usedChances;
  185. array<uint> usedCCs;
  186. array<PlayerValue> playerValues;
  187. array<int> moneyValues;
  188.  
  189. array<string> squareNames = {
  190.         "||||START",
  191.         "Diamondus Drive",
  192.         "Lagunicus Lowland",
  193.         "||||CHANCE",
  194.         "Letni Loop",
  195.         "||||JAIL",
  196.         "Raneforus Road",
  197.         "Exoticus Avenue",
  198.         "||||COMMUNITY CHEST",
  199.         "Muckamok Marsh",
  200.         "||||FREE PARKING",
  201.         "Ceramicus Corner",
  202.         "Stonar Subway",
  203.         "||||CHANCE",
  204.         "Scraparap Street",
  205.         "||||GO TO JAIL!",
  206.         "Industrius Section",
  207.         "Deserto Downtown",
  208.         "||||COMMUNITY CHEST",
  209.         "Holidaius Hills"
  210. };
  211.  
  212. //*END OF OTHER DECLARATIONS*//
  213.  
  214. //*CLASSES*//
  215.  
  216. class Dice {
  217.         uint sides;
  218.        
  219.         Dice() {
  220.                 sides = 6;
  221.         }
  222.        
  223.         Dice(uint Sides) {
  224.                 sides = Sides;
  225.         }
  226.        
  227.         int throwDice() {
  228.                 int diceResult = jjRandom() % sides + 1;
  229.                 return diceResult;
  230.         }
  231. }
  232.  
  233. class PlayerLoc {
  234.         int8 pID; //playerID
  235.         int8 finalPosition;
  236.         int currSquare;
  237.         int coins;
  238.         int jailedTurns; //if 0, equals to not in jail
  239.         int propertiesOwned;
  240.         string playerName;
  241.         bool hasWildCard;
  242.         bool isOut; //eliminated
  243.         bool isOccupied;
  244.         array<int> ownedSquares;
  245.        
  246.         PlayerLoc() {
  247.                 pID = -1;
  248.                 currSquare = 0;
  249.                 coins = 0;
  250.                 jailedTurns = 0;
  251.                 propertiesOwned = 0;
  252.                 playerName = "";
  253.                 hasWildCard = false;
  254.                 isOut = false;
  255.                 isOccupied = false;
  256.                 array<int> ownedSquares;
  257.                 finalPosition = 0;
  258.         }
  259.        
  260.         PlayerLoc(int8 PID, int8 FinalPosition, int CurrSquare, int Coins, int JailedTurns, int PropertiesOwned, string PlayerName, bool HasWildCard, bool IsOut, bool IsOccupied, array<int> OwnedSquares) {
  261.                 pID = PID;
  262.                 finalPosition = FinalPosition;
  263.                 currSquare = CurrSquare;
  264.                 coins = Coins;
  265.                 jailedTurns = JailedTurns;
  266.                 propertiesOwned = PropertiesOwned;
  267.                 playerName = PlayerName;
  268.                 hasWildCard = HasWildCard;
  269.                 isOut = IsOut;
  270.                 isOccupied = IsOccupied;
  271.                 ownedSquares = OwnedSquares;
  272.         }
  273. }
  274.  
  275. class Square {
  276.         int squareID;
  277.         int8 owner; //the playerID of the owner
  278.         int price; //price in coins
  279.         int sellPrice;
  280.         double upPrice;
  281.         int rent; //rent price, when a player whose playerID doesn't match the owner enters the square, the player must pay the rent price
  282.         int8 rentLevel;
  283.         string name;
  284.        
  285.         Square() {
  286.                 squareID = 0;
  287.                 owner = -1;
  288.                 price = 0;
  289.                 sellPrice = 0;
  290.                 upPrice = 0;
  291.                 rent = 0;
  292.                 rentLevel = 0;
  293.                 name = "";
  294.         }
  295.        
  296.         Square(int SquareID, int8 Owner, int Price, int SellPrice, int Rent, string Name) {
  297.                 squareID = SquareID;
  298.                 owner = Owner;
  299.                 price = Price;
  300.                 sellPrice = SellPrice;
  301.                 rent = Rent;
  302.                 name = Name;
  303.                 upPrice = Price * 0.6;
  304.         }
  305.        
  306.         Square(int SquareID, int8 Owner, int Price, int SellPrice, int Rent, string Name, int RentLevel) {
  307.                 squareID = SquareID;
  308.                 owner = Owner;
  309.                 price = Price;
  310.                 sellPrice = SellPrice;
  311.                 rent = Rent;
  312.                 name = Name;
  313.                 rentLevel = RentLevel;
  314.                 upPrice = Price * 0.6;
  315.         }
  316. }
  317.  
  318. class PlayerValue {
  319.         int8 pID;
  320.         int value;
  321.        
  322.         PlayerValue() {
  323.                 pID = -1;
  324.                 value = 0;
  325.         }
  326.        
  327.         PlayerValue(int PID, int Value) {
  328.                 pID = PID;
  329.                 value = Value;
  330.         }
  331. }
  332.  
  333. //*END OF CLASSES*//
  334.  
  335. //*CLIENT COMMUNICATION*//
  336.  
  337. void sendTurnStartPacket(int8 playerID) { //sent by the server
  338.         jjSTREAM packet;
  339.         packet.push(uint8(packet_turnStart));
  340.         int toClientID = jjPlayers[playerID].clientID;
  341.         jjSendPacket(packet, toClientID);
  342. }
  343.  
  344. void sendTurnFinishPacket(int8 playerID) { //sent by the client when the player finishes the turn before timer runs out
  345.         jjSTREAM packet;
  346.         packet.push(uint8(packet_turnFinish));
  347.         packet.push(playerID);
  348.         jjSendPacket(packet);
  349. }
  350.  
  351. void sendTurnSkipPacket(int8 playerID) { //sent by the server
  352.         jjSTREAM packet;
  353.         packet.push(uint8(packet_turnSkip));
  354.         packet.push(playerID);
  355.         int toClientID = jjPlayers[playerID].clientID;
  356.         jjSendPacket(packet, toClientID);
  357. }
  358.  
  359. void sendMovePacket(int8 playerID, int currSquare) { //sent by client
  360.         jjSTREAM packet;
  361.         packet.push(uint8(packet_move));
  362.         packet.push(playerID);
  363.         packet.push(currSquare);
  364.         packet.push(yourPlayerNo); //which player's square shall be updated in the players-array
  365.         jjSendPacket(packet);
  366. }
  367.  
  368. void sendRentPacket(int8 playerID, int8 ownerID, int rent) { //sent by client
  369.         jjSTREAM packet;
  370.         packet.push(uint8(packet_rent));
  371.         packet.push(playerID);
  372.         packet.push(ownerID); //to whom shall the server redirect the rent
  373.         packet.push(rent);
  374.         jjSendPacket(packet);
  375. }
  376.  
  377. void sendBuyPacket(int8 playerID, int squareID, int price) { //sent by client
  378.         jjSTREAM packet;
  379.         packet.push(uint8(packet_buy));
  380.         packet.push(playerID);
  381.         packet.push(squareID);
  382.         packet.push(price);
  383.         packet.push(yourPlayerNo);
  384.         jjSendPacket(packet);
  385. }
  386.  
  387. void sendSellPacket(int8 playerID, int squareID, int sellPrice, uint index) { //sent by client
  388.         jjSTREAM packet;
  389.         packet.push(uint8(packet_sell));
  390.         packet.push(playerID);
  391.         packet.push(squareID);
  392.         packet.push(sellPrice);
  393.         packet.push(yourPlayerNo);
  394.         packet.push(index);
  395.         jjSendPacket(packet);
  396. }
  397.  
  398. void sendJailPacket(int8 playerID) { //sent by client
  399.         jjSTREAM packet;
  400.         packet.push(uint8(packet_jail));
  401.         packet.push(playerID);
  402.         packet.push(yourPlayerNo); //which player's square shall be updated in the players-array
  403.         jjSendPacket(packet);
  404. }
  405.  
  406. void sendJailAvoidPacket(int8 playerID, int8 param) { //sent by client
  407.         jjSTREAM packet;
  408.         packet.push(uint8(packet_jailAvoid));
  409.         packet.push(playerID);
  410.         packet.push(param);
  411.         jjSendPacket(packet);
  412. }
  413.  
  414. void sendChancePacket(int8 playerID, uint chanceCase, int8 param) { //sent by client
  415.         jjSTREAM packet;
  416.         packet.push(uint8(packet_chance));
  417.         packet.push(playerID);
  418.         packet.push(chanceCase);
  419.         packet.push(param);
  420.         jjSendPacket(packet);
  421. }
  422.  
  423. void sendCCPacket(int8 playerID, uint ccCase, int8 param) { //sent by client
  424.         jjSTREAM packet;
  425.         packet.push(uint8(packet_cc));
  426.         packet.push(playerID);
  427.         packet.push(ccCase);
  428.         packet.push(param);
  429.         jjSendPacket(packet);
  430. }
  431.  
  432. void sendSignupReq(int8 playerID) { //sent by client
  433.         jjSTREAM packet;
  434.         packet.push(uint8(packet_signupReq));
  435.         packet.push(playerID);
  436.         jjSendPacket(packet);
  437. }
  438.  
  439. void sendElimPacket(int8 playerID) { //sent by client
  440.         jjSTREAM packet;
  441.         packet.push(uint8(packet_elim));
  442.         packet.push(playerID);
  443.         packet.push(yourPlayerNo);
  444.         jjSendPacket(packet);
  445. }
  446.  
  447. void sendWildCardPacket(int8 playerID) { //sent by server
  448.         jjSTREAM packet;
  449.         packet.push(uint8(packet_wildCard));
  450.         int toClientID = jjPlayers[playerID].clientID;
  451.         jjSendPacket(packet, toClientID);
  452. }
  453.  
  454. void sendWildCardUsePacket(int8 playerID) { //sent by client
  455.         jjSTREAM packet;
  456.         packet.push(uint8(packet_wildCardUse));
  457.         packet.push(playerID);
  458.         packet.push(yourPlayerNo); //which player's square shall be updated in the players-array
  459.         jjSendPacket(packet);
  460. }
  461.  
  462. void sendCoinPacket(int8 playerID, int coins) { //sent by everyone
  463.         jjSTREAM packet;
  464.         packet.push(uint8(packet_coin));
  465.         packet.push(playerID);
  466.         packet.push(yourPlayerNo);
  467.         packet.push(coins);
  468.         jjSendPacket(packet);
  469. }
  470.  
  471. void sendOption1Packet(int8 playerID) { //sent by client
  472.         jjSTREAM packet;
  473.         packet.push(uint8(packet_option1));
  474.         packet.push(playerID);
  475.         jjSendPacket(packet);
  476. }
  477.  
  478. void sendOption2Packet(int8 playerID) { //sent by client
  479.         jjSTREAM packet;
  480.         packet.push(uint8(packet_option2));
  481.         packet.push(playerID);
  482.         jjSendPacket(packet);
  483. }
  484.  
  485. void onReceive(jjSTREAM &in packet, int clientID) {
  486.         uint8 type;
  487.         packet.pop(type);
  488.         if (jjIsServer) {
  489.                 switch (type) {
  490.                         case packet_turnFinish:
  491.                         {
  492.                                 int8 playerID;
  493.                                 packet.pop(playerID);
  494.                                 if (jjPlayers[playerID].clientID == clientID) {
  495.                                         if (maxTime <= 5 * 60 * 70) {
  496.                                                 int roundLength = maxTime * registered + turnDelay * registered;
  497.                                                
  498.                                                 if (roundLength == maxTime * 1 + turnDelay * 1) {
  499.                                                         roundElapsed = maxTime + 1;
  500.                                                 }
  501.                                                
  502.                                                 else if (roundLength == maxTime * 2 + turnDelay * 2) {
  503.                                                         if (currentTurn == 0) roundElapsed = maxTime + 1;
  504.                                                         else roundElapsed = maxTime * 2 + turnDelay + 1;
  505.                                                 }
  506.                                                
  507.                                                 else if (roundLength == maxTime * 3 + turnDelay * 3) {
  508.                                                         if (currentTurn == 0) roundElapsed = maxTime + 1;
  509.                                                         else if (currentTurn == 1) roundElapsed = maxTime * 2 + turnDelay + 1;
  510.                                                         else roundElapsed = maxTime * 3 + turnDelay * 2 + 1;
  511.                                                 }
  512.                                                
  513.                                                 else if (roundLength == maxTime * 4 + turnDelay * 4) {
  514.                                                         if (currentTurn == 0) roundElapsed = maxTime + 1;
  515.                                                         else if (currentTurn == 1) roundElapsed = maxTime * 2 + turnDelay + 1;
  516.                                                         else if (currentTurn == 2) roundElapsed = maxTime * 3 + turnDelay * 2 + 1;
  517.                                                         else roundElapsed = maxTime * 4 + turnDelay * 2 + 1;
  518.                                                 }
  519.                                         }
  520.                                        
  521.                                         else { //unlimited time-mode
  522.                                                 if (registered == 1) {
  523.                                                         playerTurn = 0;
  524.                                                         doTurn = true;
  525.                                                 }
  526.                                                
  527.                                                 else if (registered == 2) {
  528.                                                         if (currentTurn == 0) {
  529.                                                                 playerTurn = 1;
  530.                                                                 doTurn = true;
  531.                                                         }
  532.                                                        
  533.                                                         else {
  534.                                                                 playerTurn = 0;
  535.                                                                 doTurn = true;
  536.                                                         }
  537.                                                 }
  538.                                                
  539.                                                 else if (registered == 3) {
  540.                                                         if (currentTurn == 0) {
  541.                                                                 playerTurn = 1;
  542.                                                                 doTurn = true;
  543.                                                         }
  544.                                                        
  545.                                                         else if (currentTurn == 1) {
  546.                                                                 playerTurn = 2;
  547.                                                                 doTurn = true;
  548.                                                         }
  549.                                                        
  550.                                                         else {
  551.                                                                 playerTurn = 0;
  552.                                                                 doTurn = true;
  553.                                                         }
  554.                                                 }
  555.                                                
  556.                                                 else if (registered == 4) {
  557.                                                         if (currentTurn == 0) {
  558.                                                                 playerTurn = 1;
  559.                                                                 doTurn = true;
  560.                                                         }
  561.                                                        
  562.                                                         else if (currentTurn == 1) {
  563.                                                                 playerTurn = 2;
  564.                                                                 doTurn = true;
  565.                                                         }
  566.                                                        
  567.                                                         else if (currentTurn == 2) {
  568.                                                                 playerTurn = 3;
  569.                                                                 doTurn = true;
  570.                                                         }
  571.                                                        
  572.                                                         else {
  573.                                                                 playerTurn = 0;
  574.                                                                 doTurn = true;
  575.                                                         }
  576.                                                 }
  577.                                         }
  578.                                 }
  579.                         }
  580.                         break;
  581.                        
  582.                         case packet_signupReq:
  583.                         {
  584.                                 int8 playerID;
  585.                                 packet.pop(playerID);
  586.                                
  587.                                 if (jjPlayers[playerID].clientID == clientID) {
  588.                                         handleSignups(playerID);
  589.                                 }
  590.                         }
  591.                         break;
  592.                        
  593.                         case packet_move:
  594.                         {
  595.                                 int8 playerID;
  596.                                 packet.pop(playerID);
  597.                                
  598.                                 if (jjPlayers[playerID].clientID == clientID) {
  599.                                         int receivedSquare;
  600.                                         packet.pop(receivedSquare);
  601.                                         int8 whichPlayer;
  602.                                         packet.pop(whichPlayer);
  603.                                        
  604.                                         players[whichPlayer].currSquare = receivedSquare;
  605.                                        
  606.                                         jjSTREAM globalUpdate;
  607.                                         globalUpdate.push(uint8(packet_move));
  608.                                         globalUpdate.push(playerID);
  609.                                         globalUpdate.push(receivedSquare);
  610.                                         globalUpdate.push(whichPlayer);
  611.                                         jjSendPacket(globalUpdate, -clientID); //negative toClientID, so to all except the player who sent the first packet
  612.                                 }
  613.                         }
  614.                         break;
  615.                        
  616.                         case packet_dice:
  617.                         {
  618.                                 int8 playerID;
  619.                                 packet.pop(playerID);
  620.                                
  621.                                 if (jjPlayers[playerID].clientID == clientID) {
  622.                                         int receivedDie; //Die;
  623.                                         packet.pop(receivedDie);
  624.                                        
  625.                                         string playerName = jjPlayers[playerID].name;
  626.                                         jjAlert("" + playerName + " threw number " + receivedDie, true);
  627.                                 }
  628.                         }
  629.                         break;
  630.                        
  631.                         case packet_rent:
  632.                         {
  633.                                 int8 playerID;
  634.                                 packet.pop(playerID);
  635.                                
  636.                                 if (jjPlayers[playerID].clientID == clientID) {
  637.                                         int8 ownerID;
  638.                                         packet.pop(ownerID);
  639.                                        
  640.                                         int rent;
  641.                                         packet.pop(rent);
  642.                                        
  643.                                         if (jjPlayers[ownerID].isLocal) {
  644.                                                 string senderName = jjPlayers[playerID].name;
  645.                                                 jjAlert("You receive " + rent + " coins from " + senderName, false, STRING::MEDIUM);
  646.                                                
  647.                                                 coinElapsed = 1;
  648.                                                 coinFinal = rent * 2 + 1;
  649.                                                 giveCoins = true;
  650.                                         }
  651.                                        
  652.                                         else { //if the owner is not the server
  653.                                                 jjSTREAM coinRedirect;
  654.                                                 coinRedirect.push(uint8(packet_rent));
  655.                                                 coinRedirect.push(playerID);
  656.                                                 coinRedirect.push(ownerID);
  657.                                                 coinRedirect.push(rent);
  658.                                                
  659.                                                 int toClientID = jjPlayers[ownerID].clientID;
  660.                                                 jjSendPacket(coinRedirect, toClientID);
  661.                                         }
  662.                                 }
  663.                         }
  664.                         break;
  665.                        
  666.                         case packet_buy:
  667.                         {
  668.                                 int8 playerID;
  669.                                 packet.pop(playerID);
  670.                                
  671.                                 if (jjPlayers[playerID].clientID == clientID) {
  672.                                         int squareID;
  673.                                         packet.pop(squareID);
  674.                                         int price;
  675.                                         packet.pop(price);
  676.                                         int8 whichPlayer;
  677.                                         packet.pop(whichPlayer);
  678.                                        
  679.                                         players[whichPlayer].propertiesOwned++;
  680.                                         players[whichPlayer].ownedSquares.insertLast(squareID);
  681.                                         squares[squareID].owner = playerID;
  682.                                         string playerName = jjPlayers[playerID].name;
  683.                                         string squareName = squares[squareID].name;
  684.                                         jjAlert("" + playerName + " has bought " + squareName + " for " + price + " coins.");
  685.                                        
  686.                                         jjSTREAM buyRedirect;
  687.                                         buyRedirect.push(uint8(packet_buy));
  688.                                         buyRedirect.push(playerID);
  689.                                         buyRedirect.push(squareID);
  690.                                         buyRedirect.push(price);
  691.                                         buyRedirect.push(whichPlayer);
  692.                                         jjSendPacket(buyRedirect, -clientID);
  693.                                 }
  694.                         }
  695.                         break;
  696.                        
  697.                         case packet_sell:
  698.                         {
  699.                                 int8 playerID;
  700.                                 packet.pop(playerID);
  701.                                
  702.                                 if (jjPlayers[playerID].clientID == clientID) {
  703.                                         int squareID;
  704.                                         packet.pop(squareID);
  705.                                         int sellPrice;
  706.                                         packet.pop(sellPrice);
  707.                                         int8 whichPlayer;
  708.                                         packet.pop(whichPlayer);
  709.                                         uint index;
  710.                                         packet.pop(index);
  711.                                        
  712.                                         players[whichPlayer].propertiesOwned--;
  713.                                         players[whichPlayer].ownedSquares.removeAt(index);
  714.                                         squares[squareID].owner = -1;
  715.                                         string playerName = jjPlayers[playerID].name;
  716.                                         string squareName = squares[squareID].name;
  717.                                         jjAlert("" + playerName + " has sold " + squareName + " for " + sellPrice + " coins.", true);
  718.                                        
  719.                                         jjSTREAM sellRedirect;
  720.                                         sellRedirect.push(uint8(packet_sell));
  721.                                         sellRedirect.push(playerID);
  722.                                         sellRedirect.push(squareID);
  723.                                         sellRedirect.push(sellPrice);
  724.                                         sellRedirect.push(whichPlayer);
  725.                                         sellRedirect.push(index);
  726.                                        
  727.                                         jjSendPacket(sellRedirect, -clientID);
  728.                                 }
  729.                         }
  730.                         break;
  731.                        
  732.                         case packet_idRequest:
  733.                         {
  734.                                 jjSTREAM response;
  735.                                 response.push(uint8(packet_idRequest));
  736.                                
  737.                                 for (uint i = 0; i < players.length(); i++) {
  738.                                         PlayerLoc thisPlayer = players[i]; //get the player's id
  739.                                         int8 thisID = thisPlayer.pID;
  740.                                         response.push(thisID);
  741.                                         int thisCS = thisPlayer.currSquare;
  742.                                         response.push(thisCS);
  743.                                         int thisCoins = thisPlayer.coins;
  744.                                         response.push(thisCoins);
  745.                                         bool thisIsOut = thisPlayer.isOut;
  746.                                         response.push(thisIsOut);
  747.                                         bool thisIsOccupied = thisPlayer.isOccupied;
  748.                                         response.push(thisIsOccupied);
  749.                                 }
  750.                                
  751.                                 for (uint i = 0; i < squares.length(); i++) {
  752.                                         Square thisSquare = squares[i];
  753.                                         response.push(thisSquare.owner);
  754.                                         response.push(thisSquare.rentLevel);
  755.                                 }
  756.                                
  757.                                 response.push(turnTimeLimitInt);
  758.                                
  759.                                 jjSendPacket(response, clientID);
  760.                         }
  761.                         break;
  762.                        
  763.                         case packet_jail:
  764.                         {
  765.                                 int8 playerID;
  766.                                 packet.pop(playerID);
  767.                                
  768.                                 if (jjPlayers[playerID].clientID == clientID) {
  769.                                         int8 whichPlayer;
  770.                                         packet.pop(whichPlayer);
  771.                                        
  772.                                         string playerName = jjPlayers[playerID].name;
  773.                                         jjAlert("" + playerName + " is now jailed!", true);
  774.                                         players[whichPlayer].jailedTurns = 3;
  775.                                 }
  776.                         }
  777.                         break;
  778.                        
  779.                         case packet_jailAvoid:
  780.                         {
  781.                                 int8 playerID;
  782.                                 packet.pop(playerID);
  783.                                
  784.                                 if (jjPlayers[playerID].clientID == clientID) {
  785.                                         int8 param;
  786.                                         packet.pop(param);
  787.                                         string playerName = jjPlayers[playerID].name;
  788.                                        
  789.                                         if (param == 1) jjAlert("" + playerName + " used a wild card to avoid jail!", true);
  790.                                         else jjAlert("" + playerName + " paid 15 coins to avoid jail!", true);
  791.                                 }
  792.                         }
  793.                         break;
  794.                        
  795.                         case packet_chance:
  796.                         {
  797.                                 int8 playerID;
  798.                                 packet.pop(playerID);
  799.                                
  800.                                 if (jjPlayers[playerID].clientID == clientID) {
  801.                                         uint chanceCase;
  802.                                         packet.pop(chanceCase);
  803.                                         int8 param;
  804.                                         packet.pop(param);
  805.                                        
  806.                                         switch (chanceCase) {
  807.                                                 case 1: jjAlert("" + jjPlayers[playerID].name + " finds a vacated turtle shell with 20 coins!", true);
  808.                                                 break;
  809.                                                 case 2: jjAlert("" + jjPlayers[playerID].name + " pays a fine of 15 coins!", true);
  810.                                                 break;
  811.                                                 case 3: jjAlert("" + jjPlayers[playerID].name + " moves on to Raneforus Road!", true);
  812.                                                 break;
  813.                                                 case 4: jjAlert("" + jjPlayers[playerID].name + " moves on to Holidaius Hills!", true);
  814.                                                 break;
  815.                                                 case 5: jjAlert("" + jjPlayers[playerID].name + " moves on to START!", true);
  816.                                                 break;
  817.                                                 case 6:
  818.                                                 {
  819.                                                         if (param == 0) jjAlert("" + jjPlayers[playerID].name + " has no properties to pay renovations for!", true);
  820.                                                         else jjAlert("" + jjPlayers[playerID].name + " pays renovation fees for " + param + " coins!", true);
  821.                                                 }
  822.                                                 break;
  823.                                                 case 7: jjAlert("" + jjPlayers[playerID].name + " wins 50 coins in a crossword competition!", true);
  824.                                                 break;
  825.                                                 case 8: jjAlert("" + jjPlayers[playerID].name + " moves on to Ceramicus Corner!", true);
  826.                                                 break;
  827.                                                 case 9: jjAlert("" + jjPlayers[playerID].name + " gains a wild card for JAIL!", true);
  828.                                                 break;
  829.                                                 case 10: jjAlert("" + jjPlayers[playerID].name + " is arrested!", true);
  830.                                                 break;
  831.                                                 case 11: jjAlert("" + jjPlayers[playerID].name + " gains 15 coins from a bank error!", true);
  832.                                                 break;
  833.                                                 case 12: jjAlert("" + jjPlayers[playerID].name + " loses 50 coins in a roulette! Bummer!", true);
  834.                                                 break;
  835.                                                 case 13: jjAlert("" + jjPlayers[playerID].name + " catches a space taxi and moves 3 squares forward!", true);
  836.                                                 break;
  837.                                                 case 14: jjAlert("" + jjPlayers[playerID].name + " catches a space taxi and gets 2 squares behind!", true);
  838.                                                 break;
  839.                                                 case 15: jjAlert("" + jjPlayers[playerID].name + " finds a wormhole to move ahead 5 squares!", true);
  840.                                                 break;
  841.                                                 case 16: jjAlert("Nothing seems to happen to " + jjPlayers[playerID].name + "...", true);
  842.                                                 break;
  843.                                         }
  844.                                        
  845.                                         usedChances.insertLast(chanceCase);
  846.                                        
  847.                                         jjSTREAM chanceUpdate;
  848.                                         chanceUpdate.push(uint8(packet_chance));
  849.                                         chanceUpdate.push(playerID);
  850.                                         chanceUpdate.push(chanceCase);
  851.                                         chanceUpdate.push(param);
  852.                                         jjSendPacket(chanceUpdate, -clientID);
  853.                                        
  854.                                         if (usedChances.length() == 16) {
  855.                                                 for (int i = 0; i < 16; i++) {
  856.                                                         usedChances.removeLast(); //empty used cases (shuffle deck)
  857.                                                 }
  858.                                                
  859.                                                 jjAlert("All chance cards have been used! Shuffling deck!");
  860.                                         }
  861.                                 }
  862.                         }
  863.                         break;
  864.                        
  865.                         case packet_cc:
  866.                         {
  867.                                 int8 playerID;
  868.                                 packet.pop(playerID);
  869.                                
  870.                                 if (jjPlayers[playerID].clientID == clientID) {
  871.                                         uint ccCase;
  872.                                         packet.pop(ccCase);
  873.                                         int8 param;
  874.                                         packet.pop(param);
  875.                                        
  876.                                         switch (ccCase) {
  877.                                                 case 1: jjAlert("" + jjPlayers[playerID].name + " wins 20 coins for the 2nd place in a beauty contest!", true);
  878.                                                 break;
  879.                                                 case 2: jjAlert("" + jjPlayers[playerID].name + " receives 20 coins from each player as a birthday gift!", true);
  880.                                                 break;
  881.                                                 case 3: jjAlert("" + jjPlayers[playerID].name + " pays 25 coins for medical expenses!", true);
  882.                                                 break;
  883.                                                 case 4: jjAlert("" + jjPlayers[playerID].name + " returns back to Letni Loop!", true);
  884.                                                 break;
  885.                                                 case 5: jjAlert("" + jjPlayers[playerID].name + " moves on to START!", true);
  886.                                                 break;
  887.                                                 case 6: jjAlert("" + jjPlayers[playerID].name + " gains 15 coins for tax refund!", true);
  888.                                                 break;
  889.                                                 case 7: jjAlert("" + jjPlayers[playerID].name + " gains 35 coins from saving interest!", true);
  890.                                                 break;
  891.                                                 case 8: jjAlert("" + jjPlayers[playerID].name + " pays 10 coins for insurance!", true);
  892.                                                 break;
  893.                                                 case 9: jjAlert("" + jjPlayers[playerID].name + " gains a wild card for JAIL!", true);
  894.                                                 break;
  895.                                                 case 10: jjAlert("" + jjPlayers[playerID].name + " is arrested!", true);
  896.                                                 break;
  897.                                                 case 11: jjAlert("" + jjPlayers[playerID].name + " inherits 30 coins!", true);
  898.                                                 break;
  899.                                                 case 12: jjAlert("" + jjPlayers[playerID].name + " pays public school taxes for 30 coins!", true);
  900.                                                 break;
  901.                                                 case 13:
  902.                                                 {
  903.                                                         if (param == 1) jjAlert("" + jjPlayers[playerID].name + " receives 20 coins from a power up!", true);
  904.                                                         else jjAlert("" + jjPlayers[playerID].name + " receives a rent power up!", true);
  905.                                                 }
  906.                                                 break;
  907.                                                 case 14:
  908.                                                 {
  909.                                                         if (param == 1) jjAlert("" + jjPlayers[playerID].name + " receives 60 coins from a bonus!", true);
  910.                                                         else jjAlert("" + jjPlayers[playerID].name + " gains a free random property!", true);
  911.                                                 }
  912.                                                 break;
  913.                                                 case 15:
  914.                                                 {
  915.                                                         if (param == 1) jjAlert("" + jjPlayers[playerID].name + " pays 10 coins to the poor!", true);
  916.                                                         else jjAlert("" + jjPlayers[playerID].name + " gains 5 coins for being poor (no properties)!", true);
  917.                                                 }
  918.                                                 break;
  919.                                                 case 16: jjAlert("" + jjPlayers[playerID].name + " encounters a space troll!", true);
  920.                                                 break;
  921.                                         }
  922.                                        
  923.                                         usedCCs.insertLast(ccCase);
  924.                                        
  925.                                         jjSTREAM ccUpdate;
  926.                                         ccUpdate.push(uint8(packet_cc));
  927.                                         ccUpdate.push(playerID);
  928.                                         ccUpdate.push(ccCase);
  929.                                         ccUpdate.push(param);
  930.                                         jjSendPacket(ccUpdate, -clientID);
  931.                                        
  932.                                         if (usedCCs.length() == 16) {
  933.                                                 for (int i = 0; i < 16; i++) {
  934.                                                         usedCCs.removeLast(); //empty used cases (shuffle deck)
  935.                                                 }
  936.                                                
  937.                                                 jjAlert("All community chest cards have been used! Shuffling deck!");
  938.                                         }
  939.                                 }
  940.                         }
  941.                         break;
  942.                        
  943.                         case packet_elim:
  944.                         {
  945.                                 int8 playerID;
  946.                                 packet.pop(playerID);
  947.                                
  948.                                 if (jjPlayers[playerID].clientID == clientID) {
  949.                                         int8 whichPlayer;
  950.                                         packet.pop(whichPlayer);
  951.                                         players[whichPlayer].isOut = true;
  952.                                         players[whichPlayer].propertiesOwned = 0;
  953.                                         uint listLength = players[whichPlayer].ownedSquares.length();
  954.                                        
  955.                                         for (uint u = 0; u < listLength; u++) {
  956.                                                 squares[players[whichPlayer].ownedSquares[u]].owner = -1;
  957.                                         }
  958.                                        
  959.                                         for (uint u = 0; u < listLength; u++) {
  960.                                                 players[whichPlayer].ownedSquares.removeLast();
  961.                                         }
  962.                                        
  963.                                         deducePlayers(playerID, whichPlayer);
  964.                                        
  965.                                         jjAlert("" + jjPlayers[playerID].name + " is bankrupt and thus is out!", true, STRING::MEDIUM);
  966.                                         jjAlert("All of " + jjPlayers[playerID].name + "'s properties have been freed to open market!", true, STRING::SMALL);
  967.                                        
  968.                                         jjSTREAM elimRedirect;
  969.                                         elimRedirect.push(uint8(packet_elim));
  970.                                         elimRedirect.push(playerID);
  971.                                         elimRedirect.push(whichPlayer);
  972.                                         jjSendPacket(elimRedirect, -clientID);
  973.                                        
  974.                                         jjChat("/forcespectate " + (playerID + 1) + " on");
  975.                                 }
  976.                         }
  977.                         break;
  978.                        
  979.                         case packet_noThrow:
  980.                         {
  981.                                 int8 playerID;
  982.                                 packet.pop(playerID);
  983.                                
  984.                                 if (jjPlayers[playerID].clientID == clientID) {
  985.                                         jjAlert("" + jjPlayers[playerID].name + " didn't throw the dice in time. Penalty: -20 coins!", true);
  986.                                 }
  987.                         }
  988.                         break;
  989.                        
  990.                         case packet_wildCardUse:
  991.                         {
  992.                                 int8 playerID;
  993.                                 packet.pop(playerID);
  994.                                
  995.                                 if (jjPlayers[playerID].clientID == clientID) {
  996.                                         int8 whichPlayer;
  997.                                         packet.pop(whichPlayer);
  998.                                         players[whichPlayer].hasWildCard = false;
  999.                                        
  1000.                                         if (players[whichPlayer].jailedTurns > 0) {
  1001.                                                 jjAlert("" + jjPlayers[playerID].name + " used a wild card to get free from JAIL!", true);
  1002.                                                 players[whichPlayer].jailedTurns = 0;
  1003.                                         }
  1004.                                 }
  1005.                         }
  1006.                         break;
  1007.                        
  1008.                         case packet_coin:
  1009.                         {
  1010.                                 int8 playerID;
  1011.                                 packet.pop(playerID);
  1012.                                
  1013.                                 if (jjPlayers[playerID].clientID == clientID) {
  1014.                                         int8 whichPlayer;
  1015.                                         packet.pop(whichPlayer);
  1016.                                         int coins;
  1017.                                         packet.pop(coins);
  1018.                                         players[whichPlayer].coins += coins;
  1019.                                        
  1020.                                         jjSTREAM globalResponse;
  1021.                                         globalResponse.push(uint8(packet_coin));
  1022.                                         globalResponse.push(playerID);
  1023.                                         globalResponse.push(whichPlayer);
  1024.                                         globalResponse.push(coins);
  1025.                                         jjSendPacket(globalResponse, -clientID);
  1026.                                 }
  1027.                         }
  1028.                         break;
  1029.                        
  1030.                         case packet_gameStart:
  1031.                         {
  1032.                                 int8 playerID;
  1033.                                 packet.pop(playerID);
  1034.                                
  1035.                                 if (jjPlayers[playerID].clientID == clientID) {
  1036.                                         jjChat("/start");
  1037.                                 }
  1038.                         }
  1039.                         break;
  1040.                        
  1041.                         case packet_option1:
  1042.                         {
  1043.                                 int8 playerID;
  1044.                                 packet.pop(playerID);
  1045.                                
  1046.                                 if (jjPlayers[playerID].clientID == clientID) {
  1047.                                         if (turnTimeLimitInt < 6) {
  1048.                                                 turnTimeLimitInt++;
  1049.                                                 M = minutesArray[turnTimeLimitInt];
  1050.                                                 S = secondsArray[turnTimeLimitInt];
  1051.                                                 timer = (M * 60 + S) * 70;
  1052.                                                 maxTime = (M * 60 + S) * 70;
  1053.                                         }
  1054.                                        
  1055.                                         else {
  1056.                                                 turnTimeLimitInt = 0;
  1057.                                                 M = minutesArray[turnTimeLimitInt];
  1058.                                                 S = secondsArray[turnTimeLimitInt];
  1059.                                                 timer = (M * 60 + S) * 70;
  1060.                                                 maxTime = (M * 60 + S) * 70;
  1061.                                         }
  1062.                                        
  1063.                                         jjSTREAM globalResponse;
  1064.                                         globalResponse.push(uint8(packet_option1));
  1065.                                         globalResponse.push(playerID);
  1066.                                         jjSendPacket(globalResponse, -clientID);
  1067.                                 }
  1068.                         }
  1069.                         break;
  1070.                        
  1071.                         case packet_option2:
  1072.                         {
  1073.                                 int8 playerID;
  1074.                                 packet.pop(playerID);
  1075.                                
  1076.                                 if (jjPlayers[playerID].clientID == clientID) {
  1077.                                         if (roundLimitInt < 6) {
  1078.                                                 roundLimitInt++;
  1079.                                         }
  1080.                                        
  1081.                                         else {
  1082.                                                 roundLimitInt = 0;
  1083.                                         }
  1084.                                        
  1085.                                         jjSTREAM globalResponse;
  1086.                                         globalResponse.push(uint8(packet_option2));
  1087.                                         globalResponse.push(playerID);
  1088.                                         jjSendPacket(globalResponse, -clientID);
  1089.                                 }
  1090.                         }
  1091.                         break;
  1092.                        
  1093.                         case packet_cc2:
  1094.                         {
  1095.                                 int8 playerID;
  1096.                                 packet.pop(playerID);
  1097.                                
  1098.                                 if (jjPlayers[playerID].clientID == clientID) {
  1099.                                         if (inGame) {
  1100.                                                 coinElapsed = 1;
  1101.                                                 coinFinal = 41;
  1102.                                                 takeCoins = true;
  1103.                                         }
  1104.                                        
  1105.                                         jjSTREAM cc2Redirect;
  1106.                                         cc2Redirect.push(uint8(packet_cc2));
  1107.                                         cc2Redirect.push(playerID);
  1108.                                         jjSendPacket(cc2Redirect, -clientID);
  1109.                                 }
  1110.                         }
  1111.                         break;
  1112.                        
  1113.                         case packet_rentChange:
  1114.                         {
  1115.                                 int8 playerID;
  1116.                                 packet.pop(playerID);
  1117.                                
  1118.                                 if (jjPlayers[playerID].clientID == clientID) {
  1119.                                         int propertyID;
  1120.                                         packet.pop(propertyID);
  1121.                                        
  1122.                                         squares[propertyID].rentLevel++;
  1123.                                         squares[propertyID].rent = int(squares[propertyID].price * squares[propertyID].rentLevel * 0.4);
  1124.                                         squares[propertyID].upPrice = squares[propertyID].rent * 1.5;
  1125.                                         jjAlert("" + jjPlayers[playerID].name + " has upgraded the rent of " + squares[propertyID].name + "!", true);
  1126.                                        
  1127.                                         jjSTREAM redirect;
  1128.                                         redirect.push(uint8(packet_rentChange));
  1129.                                         redirect.push(playerID);
  1130.                                         redirect.push(propertyID);
  1131.                                         jjSendPacket(redirect, -clientID);
  1132.                                 }
  1133.                         }
  1134.                         break;
  1135.                        
  1136.                         case packet_freeProperty:
  1137.                         {
  1138.                                 int8 playerID;
  1139.                                 packet.pop(playerID);
  1140.                                
  1141.                                 if (jjPlayers[playerID].clientID == clientID) {
  1142.                                         uint randomProperty;
  1143.                                         packet.pop(randomProperty);
  1144.                                         int whichPlayer;
  1145.                                         packet.pop(whichPlayer);
  1146.                                        
  1147.                                         players[whichPlayer].propertiesOwned++;
  1148.                                         players[whichPlayer].ownedSquares.insertLast(randomProperty);
  1149.                                         squares[randomProperty].owner = playerID;
  1150.                                         jjAlert("" + squares[randomProperty].name + " now belongs to " + jjPlayers[playerID].name + "!", true);
  1151.                                        
  1152.                                         jjSTREAM redirect;
  1153.                                         redirect.push(uint8(packet_freeProperty));
  1154.                                         redirect.push(playerID);
  1155.                                         redirect.push(randomProperty);
  1156.                                         redirect.push(whichPlayer);
  1157.                                         jjSendPacket(redirect, -clientID);
  1158.                                 }
  1159.                         }
  1160.                         break;
  1161.                        
  1162.                         case packet_spaceTroll:
  1163.                         {
  1164.                                 int8 playerID;
  1165.                                 packet.pop(playerID);
  1166.                                
  1167.                                 if (jjPlayers[playerID].clientID == clientID) {
  1168.                                         int8 param;
  1169.                                         packet.pop(param);
  1170.                                        
  1171.                                         if (param == 0) jjAlert("" + jjPlayers[playerID].name + " pays 10 coins to the space troll to move on!", true);
  1172.                                         else jjAlert("" + jjPlayers[playerID].name + " escapes the space troll and takes a chance!", true);
  1173.                                 }
  1174.                         }
  1175.                         break;
  1176.                 }
  1177.         }
  1178.        
  1179.         else {
  1180.                 switch (type) {
  1181.                         case packet_turnStart:
  1182.                         {
  1183.                                 round++;
  1184.                                 wait = 0;
  1185.                                 isTurn = true;
  1186.                                 bought = false;
  1187.                                 printSquare = false;
  1188.                                 printChance = false;
  1189.                                 printOK = false;
  1190.                                 waitForChance = false;
  1191.                                 waitForSelect = false;
  1192.                                 waitForMove = false;
  1193.                                 waitForMoveForward = false;
  1194.                                 waitForMoveBack = false;
  1195.                                 waitForMoveQuick = false;
  1196.                                 waitForFinish = false;
  1197.                                 preAction = true;
  1198.                                 midAction = false;
  1199.                                 postAction = false;
  1200.                                 postTurn = false;
  1201.                                 viewMap = false;
  1202.                                 selling = false;
  1203.                                 upgrading = false;
  1204.                                 drawBackground = true;
  1205.                                 hasThrown = false; //change this back to false for final version
  1206.                                 isThrowing = false;
  1207.                                 //hasSelected = false; //remove this for final version
  1208.                                 switched = false;
  1209.                                 confirmed = false;
  1210.                                 diceConfirmed = false;
  1211.                                 selectionPos = 0;
  1212.                                 jjSamplePriority(SOUND::COMMON_BELL_FIRE);
  1213.                         }
  1214.                         break;
  1215.                        
  1216.                         case packet_turnSkip:
  1217.                         {
  1218.                                 round++;
  1219.                                 wait = 0;
  1220.                                 isTurn = true;
  1221.                                 bought = false;
  1222.                                 printSquare = false;
  1223.                                 printChance = false;
  1224.                                 printOK = false;
  1225.                                 waitForChance = false;
  1226.                                 waitForSelect = false;
  1227.                                 waitForMove = false;
  1228.                                 waitForMoveForward = false;
  1229.                                 waitForMoveBack = false;
  1230.                                 waitForMoveQuick = false;
  1231.                                 waitForFinish = false;
  1232.                                 postAction = true;
  1233.                                 postTurn = false;
  1234.                                 viewMap = false;
  1235.                                 selling = false;
  1236.                                 upgrading = false;
  1237.                                 drawBackground = true;
  1238.                                 hasThrown = true; //change this back to false for final version
  1239.                                 isThrowing = false;
  1240.                                 switched = false;
  1241.                                 confirmed = false;
  1242.                                 diceConfirmed = true;
  1243.                                 selectionPos = 0;
  1244.                                 jjSamplePriority(SOUND::COMMON_BELL_FIRE);
  1245.                         }
  1246.                         break;
  1247.                        
  1248.                         case packet_signupResp:
  1249.                         {
  1250.                                 int8 playerID;
  1251.                                 packet.pop(playerID);
  1252.                                 int8 whichPlayer;
  1253.                                 packet.pop(whichPlayer);
  1254.                                 yourPlayerNo = whichPlayer;
  1255.                                 int coins;
  1256.                                 packet.pop(coins);
  1257.                                 players[yourPlayerNo].coins = coins;
  1258.                                
  1259.                                 inGame = true;
  1260.                                 jjPlayers[playerID].warpToTile(squarex[0], squarey[0], true);
  1261.                                 jjSamplePriority(SOUND::EPICLOGO_EPIC2);
  1262.                                 jjPlayers[playerID].coins = coins;
  1263.                                 jjSamplePriority(SOUND::COMMON_COIN);
  1264.                                 isInBox = false;
  1265.                                 players[yourPlayerNo].pID = playerID;
  1266.                                 players[yourPlayerNo].playerName = jjPlayers[playerID].name;
  1267.                                 players[yourPlayerNo].isOccupied = true;
  1268.                         }
  1269.                         break;
  1270.                        
  1271.                         case packet_signupAnn:
  1272.                         {
  1273.                                 int8 playerID;
  1274.                                 packet.pop(playerID);
  1275.                                 int8 whichPlayer;
  1276.                                 packet.pop(whichPlayer);
  1277.                                 int coins;
  1278.                                 packet.pop(coins);
  1279.                                
  1280.                                 players[whichPlayer].coins = coins;
  1281.                                 players[whichPlayer].pID = playerID;
  1282.                                 players[whichPlayer].playerName = jjPlayers[playerID].name;
  1283.                                 players[whichPlayer].isOccupied = true;
  1284.                         }
  1285.                         break;
  1286.                        
  1287.                         case packet_move:
  1288.                         {
  1289.                                 int8 playerID;
  1290.                                 packet.pop(playerID);
  1291.                                 int receivedSquare;
  1292.                                 packet.pop(receivedSquare);
  1293.                                 int8 whichPlayer;
  1294.                                 packet.pop(whichPlayer);
  1295.                                
  1296.                                 players[whichPlayer].currSquare = receivedSquare;
  1297.                         }
  1298.                         break;
  1299.                        
  1300.                         case packet_rent:
  1301.                         {
  1302.                                 int8 playerID;
  1303.                                 packet.pop(playerID);
  1304.                                 int8 ownerID;
  1305.                                 packet.pop(ownerID);
  1306.                                 int rent;
  1307.                                 packet.pop(rent);
  1308.                                
  1309.                                 string senderName = jjPlayers[playerID].name;
  1310.                                 jjAlert("You receive " + rent + " coins from " + senderName, false, STRING::MEDIUM);
  1311.                                
  1312.                                 coinElapsed = 1;
  1313.                                 coinFinal = rent * 2 + 1;
  1314.                                 giveCoins = true;
  1315.                         }
  1316.                         break;
  1317.                        
  1318.                         case packet_buy:
  1319.                         {
  1320.                                 int8 playerID;
  1321.                                 packet.pop(playerID);
  1322.                                 int squareID;
  1323.                                 packet.pop(squareID);
  1324.                                 int price;
  1325.                                 packet.pop(price);
  1326.                                 int8 whichPlayer;
  1327.                                 packet.pop(whichPlayer);
  1328.                                
  1329.                                 players[whichPlayer].propertiesOwned++;
  1330.                                 players[whichPlayer].ownedSquares.insertLast(squareID);
  1331.                                 squares[squareID].owner = playerID;
  1332.                                 string playerName = jjPlayers[playerID].name;
  1333.                                 string squareName = squares[squareID].name;
  1334.                                 jjAlert("" + playerName + " has bought " + squareName + " for " + price + " coins.");
  1335.                         }
  1336.                         break;
  1337.                        
  1338.                         case packet_sell:
  1339.                         {
  1340.                                 int8 playerID;
  1341.                                 packet.pop(playerID);
  1342.                                 int squareID;
  1343.                                 packet.pop(squareID);
  1344.                                 int sellPrice;
  1345.                                 packet.pop(sellPrice);
  1346.                                 int8 whichPlayer;
  1347.                                 packet.pop(whichPlayer);
  1348.                                 uint index;
  1349.                                 packet.pop(index);
  1350.                                        
  1351.                                 players[whichPlayer].propertiesOwned--;
  1352.                                 players[whichPlayer].ownedSquares.removeAt(index);
  1353.                                 squares[squareID].owner = -1;
  1354.                                 string playerName = jjPlayers[playerID].name;
  1355.                                 string squareName = squares[squareID].name;
  1356.                         }
  1357.                         break;
  1358.                        
  1359.                         case packet_idRequest:
  1360.                         {
  1361.                                 for (uint i = 0; i < players.length(); i++) {
  1362.                                         int8 thisID;
  1363.                                         packet.pop(thisID);
  1364.                                         players[i].pID = thisID;
  1365.                                         int thisCS;
  1366.                                         packet.pop(thisCS);
  1367.                                         players[i].currSquare = thisCS;
  1368.                                         int thisCoins;
  1369.                                         packet.pop(thisCoins);
  1370.                                         players[i].coins = thisCoins;
  1371.                                         bool thisIsOut;
  1372.                                         packet.pop(thisIsOut);
  1373.                                         players[i].isOut = thisIsOut;
  1374.                                         bool thisIsOccupied;
  1375.                                         packet.pop(thisIsOccupied);
  1376.                                         players[i].isOccupied = thisIsOccupied;
  1377.                                 }
  1378.                                
  1379.                                 for (uint i = 0; i < squares.length(); i++) {
  1380.                                         int8 thisOwner;
  1381.                                         int8 thisLevel;
  1382.                                         packet.pop(thisOwner);
  1383.                                         packet.pop(thisLevel);
  1384.                                         squares[i].owner = thisOwner;
  1385.                                         squares[i].rentLevel = thisLevel;
  1386.                                         squares[i].rent = int(squares[i].price * squares[i].rentLevel * 0.4);
  1387.                                         squares[i].upPrice = squares[i].rent * 1.5;
  1388.                                 }
  1389.                                
  1390.                                 packet.pop(turnTimeLimitInt);
  1391.                                 M = minutesArray[turnTimeLimitInt];
  1392.                                 S = secondsArray[turnTimeLimitInt];
  1393.                                 timer = (M * 60 + S) * 70;
  1394.                                 maxTime = (M * 60 + S) * 70;
  1395.                         }
  1396.                         break;
  1397.                        
  1398.                         case packet_jailbreak:
  1399.                         {
  1400.                                 isJailed = false;
  1401.                         }
  1402.                         break;
  1403.                        
  1404.                         case packet_chance:
  1405.                         {
  1406.                                 int8 playerID;
  1407.                                 packet.pop(playerID);
  1408.                                 uint chanceCase;
  1409.                                 packet.pop(chanceCase);
  1410.                                 int8 param;
  1411.                                 packet.pop(param);
  1412.                                
  1413.                                 usedChances.insertLast(chanceCase);
  1414.                                
  1415.                                 if (usedChances.length() == 16) {
  1416.                                         for (int i = 0; i < 16; i++) {
  1417.                                                 usedChances.removeLast(); //empty used cases (shuffle deck)
  1418.                                         }
  1419.                                        
  1420.                                         jjAlert("All chance cards have been used! Shuffling deck!");
  1421.                                 }
  1422.                         }
  1423.                         break;
  1424.                        
  1425.                         case packet_cc:
  1426.                         {
  1427.                                 int8 playerID;
  1428.                                 packet.pop(playerID);
  1429.                                 uint ccCase;
  1430.                                 packet.pop(ccCase);
  1431.                                 int8 param;
  1432.                                 packet.pop(param);
  1433.                                
  1434.                                 usedCCs.insertLast(ccCase);
  1435.                                
  1436.                                 if (usedCCs.length() == 16) {
  1437.                                         for (int i = 0; i < 16; i++) {
  1438.                                                 usedCCs.removeLast(); //empty used cases (shuffle deck)
  1439.                                         }
  1440.                                        
  1441.                                         jjAlert("All community chest cards have been used! Shuffling deck!");
  1442.                                 }
  1443.                         }
  1444.                         break;
  1445.                        
  1446.                         case packet_elim:
  1447.                         {
  1448.                                 int8 playerID;
  1449.                                 packet.pop(playerID);
  1450.                                 int8 whichPlayer;
  1451.                                 packet.pop(whichPlayer);
  1452.                                 players[whichPlayer].isOut = true;
  1453.                                 players[whichPlayer].propertiesOwned = 0;
  1454.                                
  1455.                                 uint listLength = players[whichPlayer].ownedSquares.length();
  1456.                                
  1457.                                 for (uint u = 0; u < listLength; u++) {
  1458.                                         squares[players[whichPlayer].ownedSquares[u]].owner = -1;
  1459.                                 }
  1460.                                
  1461.                                 for (uint u = 0; u < listLength; u++) {
  1462.                                         players[whichPlayer].ownedSquares.removeLast();
  1463.                                 }
  1464.                         }
  1465.                         break;
  1466.                        
  1467.                         case packet_wildCard:
  1468.                         {
  1469.                                 round++;
  1470.                                 wait = 0;
  1471.                                 isTurn = true;
  1472.                                 bought = false;
  1473.                                 printSquare = false;
  1474.                                 printChance = false;
  1475.                                 printOK = false;
  1476.                                 waitForChance = false;
  1477.                                 waitForSelect = false;
  1478.                                 waitForMove = false;
  1479.                                 waitForMoveForward = false;
  1480.                                 waitForMoveBack = false;
  1481.                                 waitForMoveQuick = false;
  1482.                                 waitForFinish = false;
  1483.                                 postTurn = false;
  1484.                                 viewMap = false;
  1485.                                 selling = false;
  1486.                                 upgrading = false;
  1487.                                 promptWildCard = true;
  1488.                                 drawBackground = true;
  1489.                                 hasThrown = false;
  1490.                                 isThrowing = false;
  1491.                                 switched = false;
  1492.                                 confirmed = false;
  1493.                                 diceConfirmed = false;
  1494.                                 selectionPos = 0;
  1495.                                 jjSamplePriority(SOUND::COMMON_BELL_FIRE);
  1496.                         }
  1497.                         break;
  1498.                        
  1499.                         case packet_coin:
  1500.                         {
  1501.                                 int8 playerID;
  1502.                                 packet.pop(playerID);
  1503.                                 int8 whichPlayer;
  1504.                                 packet.pop(whichPlayer);
  1505.                                 int coins;
  1506.                                 packet.pop(coins);
  1507.                                 players[whichPlayer].coins += coins;
  1508.                         }
  1509.                         break;
  1510.                        
  1511.                         case packet_firstPlayer:
  1512.                         {
  1513.                                 firstPlayer = true;
  1514.                                 drawBackground = true;
  1515.                         }
  1516.                         break;
  1517.                        
  1518.                         case packet_option1:
  1519.                         {
  1520.                                 int8 playerID;
  1521.                                 packet.pop(playerID);
  1522.                                
  1523.                                 if (turnTimeLimitInt < 6) {
  1524.                                         turnTimeLimitInt++;
  1525.                                         M = minutesArray[turnTimeLimitInt];
  1526.                                         S = secondsArray[turnTimeLimitInt];
  1527.                                         timer = (M * 60 + S) * 70;
  1528.                                         maxTime = (M * 60 + S) * 70;
  1529.                                 }
  1530.                                
  1531.                                 else {
  1532.                                         turnTimeLimitInt = 0;
  1533.                                         M = minutesArray[turnTimeLimitInt];
  1534.                                         S = secondsArray[turnTimeLimitInt];
  1535.                                         timer = (M * 60 + S) * 70;
  1536.                                         maxTime = (M * 60 + S) * 70;
  1537.                                 }
  1538.                         }
  1539.                         break;
  1540.                        
  1541.                         case packet_option2:
  1542.                         {
  1543.                                 int8 playerID;
  1544.                                 packet.pop(playerID);
  1545.                                
  1546.                                 if (roundLimitInt < 6) {
  1547.                                         roundLimitInt++;
  1548.                                 }
  1549.                                
  1550.                                 else {
  1551.                                         roundLimitInt = 0;
  1552.                                 }
  1553.                         }
  1554.                         break;
  1555.                        
  1556.                         case packet_registered:
  1557.                         {
  1558.                                 packet.pop(registered);
  1559.                         }
  1560.                         break;
  1561.                        
  1562.                         case packet_cc2:
  1563.                         {
  1564.                                 int8 playerID;
  1565.                                 packet.pop(playerID);
  1566.                                
  1567.                                 if (inGame) {
  1568.                                         coinElapsed = 1;
  1569.                                         coinFinal = 41;
  1570.                                         takeCoins = true;
  1571.                                 }
  1572.                         }
  1573.                         break;
  1574.                        
  1575.                         case packet_rentChange:
  1576.                         {
  1577.                                 int8 playerID;
  1578.                                 packet.pop(playerID);
  1579.                                 int propertyID;
  1580.                                 packet.pop(propertyID);
  1581.                                
  1582.                                 squares[propertyID].rentLevel++;
  1583.                                 squares[propertyID].rent = int(squares[propertyID].price * squares[propertyID].rentLevel * 0.4);
  1584.                                 squares[propertyID].upPrice = squares[propertyID].rent * 1.5;
  1585.                         }
  1586.                         break;
  1587.                        
  1588.                         case packet_freeProperty:
  1589.                         {
  1590.                                 int8 playerID;
  1591.                                 packet.pop(playerID);
  1592.                                 uint randomProperty;
  1593.                                 packet.pop(randomProperty);
  1594.                                 int8 whichPlayer;
  1595.                                 packet.pop(whichPlayer);
  1596.                                
  1597.                                 players[whichPlayer].propertiesOwned++;
  1598.                                 players[whichPlayer].ownedSquares.insertLast(randomProperty);
  1599.                                 squares[randomProperty].owner = playerID;
  1600.                         }
  1601.                         break;
  1602.                        
  1603.                         case packet_endGame:
  1604.                         {
  1605.                                 gameEnded = true;
  1606.                                 drawBackground = true;
  1607.                                 requestedPage = page_blank;
  1608.                                 viewMap = true;
  1609.                         }
  1610.                         break;
  1611.                        
  1612.                         case packet_players:
  1613.                         {
  1614.                                 int8 whichPlayer;
  1615.                                 packet.pop(whichPlayer);
  1616.                                 packet.pop(playersLeft);
  1617.                                
  1618.                                 players[whichPlayer].finalPosition = playersLeft;
  1619.                         }
  1620.                         break;
  1621.                        
  1622.                         case packet_gameEnding:
  1623.                         {
  1624.                                 for (uint i = 0; i < players.length; i++) {
  1625.                                         packet.pop(players[i].finalPosition);
  1626.                                        
  1627.                                         //jjAlert("finalPosition of " + jjPlayers[players[i].pID].name + ": " + players[i].finalPosition);
  1628.                                 }
  1629.                         }
  1630.                        
  1631.                         case packet_gameCancel:
  1632.                         {
  1633.                                 gameStarted = false;
  1634.                         }
  1635.                 }
  1636.         }
  1637. }
  1638.  
  1639. //*END OF CLIENT COMMUNICATION*//
  1640.  
  1641. //*DRAWING HOOKS*//
  1642.  
  1643. bool onDrawHealth(jjPLAYER@ play, jjCANVAS@ canvas) {
  1644.         return true;
  1645. }
  1646.  
  1647. bool onDrawAmmo(jjPLAYER@ play, jjCANVAS@ canvas) { //changed to onDrawAmmo from onDrawHealth, so works on treasure hunt mode as well
  1648.         jjTEXTAPPEARANCE centeredText();
  1649.         centeredText.align = STRING::CENTER;
  1650.         centeredText.pipe = STRING::SPECIALSIGN;
  1651.        
  1652.         int isTSFintSigns;
  1653.                
  1654.         if (jjIsTSF) isTSFintSigns = 4;
  1655.         else isTSFintSigns = 0;
  1656.  
  1657.         if (statsMode == 3) { //with extended stats
  1658.                 canvas.drawRectangle(20, 70, 100, 72, 72, SPRITE::TRANSLUCENT, 0); //center
  1659.                 canvas.drawRectangle(20, 66, 100, 4, 72, SPRITE::TRANSLUCENT, 0); //top
  1660.                 canvas.drawRectangle(120, 70, 4, 72, 72, SPRITE::TRANSLUCENT, 0); //right
  1661.                 canvas.drawRectangle(20, 142, 100, 4, 72, SPRITE::TRANSLUCENT, 0); //bottom
  1662.                 canvas.drawRectangle(16, 70, 4, 72, 72, SPRITE::TRANSLUCENT, 0); //left
  1663.                 int drawtr = 120;
  1664.                 for (int y = 66; y < 70; y++) {
  1665.                         drawtr++;
  1666.                        
  1667.                         for (int x = 120; x < drawtr; x++) {
  1668.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1669.                         }
  1670.                 }
  1671.                 int drawbr = 120;
  1672.                 for (int y = 145; y > 141; y--) {
  1673.                         drawbr++;
  1674.                        
  1675.                         for (int x = 120; x < drawbr; x++) {
  1676.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1677.                         }
  1678.                 }
  1679.                 int drawbl = 19;
  1680.                 for (int y = 145; y > 141; y--) {
  1681.                         drawbl--;
  1682.                        
  1683.                         for (int x = 19; x > drawbl; x--) {
  1684.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1685.                         }
  1686.                 }
  1687.                 int drawtl = 19;
  1688.                 for (int y = 66; y < 70; y++) {
  1689.                         drawtl--;
  1690.                        
  1691.                         for (int x = 19; x > drawtl; x--) {
  1692.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1693.                         }
  1694.                 }
  1695.                
  1696.                 canvas.drawRectangle(20, 200, jjSubscreenWidth - 40, 240, 72, SPRITE::TRANSLUCENT, 0); //center
  1697.                 canvas.drawRectangle(20, 196, jjSubscreenWidth - 40, 4, 72, SPRITE::TRANSLUCENT, 0); //top
  1698.                 canvas.drawRectangle(jjSubscreenWidth - 20, 200, 4, 240, 72, SPRITE::TRANSLUCENT, 0); //right
  1699.                 canvas.drawRectangle(20, 440, jjSubscreenWidth - 40, 4, 72, SPRITE::TRANSLUCENT, 0); //bottom
  1700.                 canvas.drawRectangle(16, 200, 4, 240, 72, SPRITE::TRANSLUCENT, 0); //left
  1701.                 drawtr = jjSubscreenWidth - 20;
  1702.                 for (int y = 196; y < 200; y++) {
  1703.                         drawtr++;
  1704.                        
  1705.                         for (int x = jjSubscreenWidth - 20; x < drawtr; x++) {
  1706.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1707.                         }
  1708.                 }
  1709.                 drawbr = jjSubscreenWidth - 20;
  1710.                 for (int y = 443; y > 439; y--) {
  1711.                         drawbr++;
  1712.                        
  1713.                         for (int x = jjSubscreenWidth - 20; x < drawbr; x++) {
  1714.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1715.                         }
  1716.                 }
  1717.                 drawbl = 19;
  1718.                 for (int y = 443; y > 439; y--) {
  1719.                         drawbl--;
  1720.                        
  1721.                         for (int x = 19; x > drawbl; x--) {
  1722.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1723.                         }
  1724.                 }
  1725.                 drawtl = 19;
  1726.                 for (int y = 196; y < 200; y++) {
  1727.                         drawtl--;
  1728.                        
  1729.                         for (int x = 19; x > drawtl; x--) {
  1730.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1731.                         }
  1732.                 }
  1733.                
  1734.                 canvas.drawResizedSprite(26, 84, 67 + isTSFintSigns, 1, 0, 0.5, 0.5, SPRITE::NORMAL, 0);
  1735.                 canvas.drawResizedSprite(26, 100, 67 + isTSFintSigns, 2, 0, 0.5, 0.5, SPRITE::NORMAL, 0);
  1736.                 canvas.drawResizedSprite(26, 116, 67 + isTSFintSigns, 16, 0, 0.5, 0.5, SPRITE::NORMAL, 0);
  1737.                 canvas.drawResizedSprite(26, 132, 67 + isTSFintSigns, 71, 0, 0.5, 0.5, SPRITE::NORMAL, 0);
  1738.                
  1739.                 for (int i = 0; i < 4; i++) {
  1740.                         if (players[i].pID == -1) canvas.drawString(60, 86 + 16 * i, "OFF", STRING::SMALL, centeredText);
  1741.                         else {
  1742.                                 if (players[i].isOut) canvas.drawString(100, 86 + 16 * i, "||OUT", STRING::SMALL, centeredText);
  1743.                                 if (players[i].coins >= 0) canvas.drawString(60, 86 + 16 * i, "" + players[i].coins, STRING::SMALL, centeredText);
  1744.                                 else canvas.drawString(60, 86 + 16 * i, "||" + players[i].coins, STRING::SMALL, centeredText);
  1745.                         }
  1746.                 }
  1747.                
  1748.                 canvas.drawString(24, 208, "Property Name", STRING::SMALL);
  1749.                 canvas.drawString(jjSubscreenWidth / 20 * 9, 208, "Owner Name", STRING::SMALL, centeredText);
  1750.                 canvas.drawString(jjSubscreenWidth / 10 * 7, 208, "Price", STRING::SMALL, centeredText);
  1751.                 canvas.drawString(jjSubscreenWidth / 10 * 8, 208, "Rent", STRING::SMALL, centeredText);
  1752.                 canvas.drawString(jjSubscreenWidth / 10 * 9, 208, "Level", STRING::SMALL, centeredText);
  1753.                 array<string> squareOwnerNames(20); //same length as squares, for simplicity
  1754.                 int negCounter = 0;
  1755.                 int j = 0;
  1756.                 for (int i = 0; i < 20; i++) {
  1757.                         int8 squareOwner = squares[i].owner;
  1758.                        
  1759.                         if (squareOwner >= 0) {
  1760.                                 string squareOwnerName = jjPlayers[squareOwner].name;
  1761.                                 squareOwnerNames[i] = squareOwnerName;
  1762.                                
  1763.                                 if (j % 2 == 0) {
  1764.                                         canvas.drawString(24, 240 + 16 * i + negCounter, "" + squares[i].name, STRING::SMALL, STRING::PALSHIFT, 24);
  1765.                                         canvas.drawString(jjSubscreenWidth / 20 * 9, 240 + 16 * i + negCounter, "" + squareOwnerNames[i], STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  1766.                                         canvas.drawString(jjSubscreenWidth / 10 * 7, 240 + 16 * i + negCounter, "" + squares[i].price, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  1767.                                         canvas.drawString(jjSubscreenWidth / 10 * 8, 240 + 16 * i + negCounter, "" + squares[i].rent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  1768.                                         canvas.drawString(jjSubscreenWidth / 10 * 9, 240 + 16 * i + negCounter, "" + squares[i].rentLevel, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  1769.                                 }
  1770.                                
  1771.                                 else {
  1772.                                         canvas.drawString(24, 240 + 16 * i + negCounter, "" + squares[i].name, STRING::SMALL, STRING::PALSHIFT, 16);
  1773.                                         canvas.drawString(jjSubscreenWidth / 20 * 9, 240 + 16 * i + negCounter, "" + squareOwnerNames[i], STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  1774.                                         canvas.drawString(jjSubscreenWidth / 10 * 7, 240 + 16 * i + negCounter, "" + squares[i].price, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  1775.                                         canvas.drawString(jjSubscreenWidth / 10 * 8, 240 + 16 * i + negCounter, "" + squares[i].rent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  1776.                                         canvas.drawString(jjSubscreenWidth / 10 * 9, 240 + 16 * i + negCounter, "" + squares[i].rentLevel, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  1777.                                 }
  1778.                                
  1779.                                 j++;
  1780.                         }
  1781.                        
  1782.                         else if (squareOwner == -1) {
  1783.                                 if (j % 2 == 0) {
  1784.                                         canvas.drawString(24, 240 + 16 * i + negCounter, "" + squares[i].name, STRING::SMALL, STRING::PALSHIFT, 24);
  1785.                                         canvas.drawString(jjSubscreenWidth / 10 * 7, 240 + 16 * i + negCounter, "" + squares[i].price, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  1786.                                         canvas.drawString(jjSubscreenWidth / 10 * 8, 240 + 16 * i + negCounter, "" + squares[i].rent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  1787.                                         canvas.drawString(jjSubscreenWidth / 10 * 9, 240 + 16 * i + negCounter, "" + squares[i].rentLevel, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  1788.                                 }
  1789.                                
  1790.                                 else {
  1791.                                         canvas.drawString(24, 240 + 16 * i + negCounter, "" + squares[i].name, STRING::SMALL, STRING::PALSHIFT, 16);
  1792.                                         canvas.drawString(jjSubscreenWidth / 10 * 7, 240 + 16 * i + negCounter, "" + squares[i].price, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  1793.                                         canvas.drawString(jjSubscreenWidth / 10 * 8, 240 + 16 * i + negCounter, "" + squares[i].rent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  1794.                                         canvas.drawString(jjSubscreenWidth / 10 * 9, 240 + 16 * i + negCounter, "" + squares[i].rentLevel, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  1795.                                 }
  1796.                                
  1797.                                 j++;
  1798.                         }
  1799.                        
  1800.                         else {
  1801.                                 negCounter -= 16;
  1802.                         }
  1803.                 }
  1804.         }
  1805.        
  1806.         if (statsMode == 2) {
  1807.                 canvas.drawRectangle(20, 70, 100, 72, 72, SPRITE::TRANSLUCENT, 0); //center
  1808.                 canvas.drawRectangle(20, 66, 100, 4, 72, SPRITE::TRANSLUCENT, 0); //top
  1809.                 canvas.drawRectangle(120, 70, 4, 72, 72, SPRITE::TRANSLUCENT, 0); //right
  1810.                 canvas.drawRectangle(20, 142, 100, 4, 72, SPRITE::TRANSLUCENT, 0); //bottom
  1811.                 canvas.drawRectangle(16, 70, 4, 72, 72, SPRITE::TRANSLUCENT, 0); //left
  1812.                 int drawtr = 120;
  1813.                 for (int y = 66; y < 70; y++) {
  1814.                         drawtr++;
  1815.                        
  1816.                         for (int x = 120; x < drawtr; x++) {
  1817.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1818.                         }
  1819.                 }
  1820.                 int drawbr = 120;
  1821.                 for (int y = 145; y > 141; y--) {
  1822.                         drawbr++;
  1823.                        
  1824.                         for (int x = 120; x < drawbr; x++) {
  1825.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1826.                         }
  1827.                 }
  1828.                 int drawbl = 19;
  1829.                 for (int y = 145; y > 141; y--) {
  1830.                         drawbl--;
  1831.                        
  1832.                         for (int x = 19; x > drawbl; x--) {
  1833.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1834.                         }
  1835.                 }
  1836.                 int drawtl = 19;
  1837.                 for (int y = 66; y < 70; y++) {
  1838.                         drawtl--;
  1839.                        
  1840.                         for (int x = 19; x > drawtl; x--) {
  1841.                                 canvas.drawPixel(x, y, 72, SPRITE::TRANSLUCENT, 0);
  1842.                         }
  1843.                 }
  1844.                
  1845.                 canvas.drawResizedSprite(26, 84, 67 + isTSFintSigns, 1, 0, 0.5, 0.5, SPRITE::NORMAL, 0);
  1846.                 canvas.drawResizedSprite(26, 100, 67 + isTSFintSigns, 2, 0, 0.5, 0.5, SPRITE::NORMAL, 0);
  1847.                 canvas.drawResizedSprite(26, 116, 67 + isTSFintSigns, 16, 0, 0.5, 0.5, SPRITE::NORMAL, 0);
  1848.                 canvas.drawResizedSprite(26, 132, 67 + isTSFintSigns, 71, 0, 0.5, 0.5, SPRITE::NORMAL, 0);
  1849.                
  1850.                 for (int i = 0; i < 4; i++) {
  1851.                         if (players[i].pID == -1) canvas.drawString(60, 86 + 16 * i, "OFF", STRING::SMALL, centeredText);
  1852.                         else {
  1853.                                 if (players[i].isOut) canvas.drawString(100, 86 + 16 * i, "||OUT", STRING::SMALL, centeredText);
  1854.                                 if (players[i].coins >= 0) canvas.drawString(60, 86 + 16 * i, "" + players[i].coins, STRING::SMALL, centeredText);
  1855.                                 else canvas.drawString(60, 86 + 16 * i, "||" + players[i].coins, STRING::SMALL, centeredText);
  1856.                         }
  1857.                 }
  1858.         }
  1859.        
  1860.         else if (statsMode == 1) {
  1861.                 canvas.drawString(4, 64, "Press 0 to toggle stats");
  1862.                 canvas.drawString(4, 80, "Press fire to select option");
  1863.                 canvas.drawString(4, 96, "Use arrow keys to switch options");
  1864.         }
  1865.        
  1866.         if (isTurn && maxTime <= 5 * 60 * 70) {
  1867.                 canvas.drawString(jjSubscreenWidth - 112, 32*3, "||||||||Your turn!");
  1868.                 canvas.drawString(jjSubscreenWidth - 64, 32*3.5, turnTimer);
  1869.         }
  1870.        
  1871.         if (isTurn && hasThrown && printDice) {
  1872.                 canvas.drawString(jjSubscreenWidth / 2 - 8, 444, "||" + lastThrownNumber, STRING::LARGE, STRING::NORMAL); //312, 164
  1873.         }
  1874.        
  1875.         if (viewMap) {
  1876.                 int isTSFintArrow;
  1877.        
  1878.                 if (jjIsTSF) isTSFintArrow = 1;
  1879.                 else isTSFintArrow = 0;
  1880.                
  1881.                 canvas.drawRotatedSprite(jjMouseX + 16, jjMouseY + 24, 43 + isTSFintArrow, 0, 0, 288, 1, 1, SPRITE::NORMAL);
  1882.                
  1883.                 if (isTurn && requestedPage != page_blank && gameRuns) {
  1884.                         canvas.drawString(jjSubscreenWidth / 2, 188, "Press fire to return!", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  1885.                 }
  1886.         }
  1887.        
  1888.         if (isInBox && !gameEnded && !gameRuns) {
  1889.                 canvas.drawString(jjSubscreenWidth / 2, 164, "Press fire to sign up for the game!", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 16);
  1890.         }
  1891.        
  1892.         else if (inGame && !gameStarted && !gameEnded && !firstPlayer) {
  1893.                 canvas.drawString(jjSubscreenWidth / 2, 164, "Type /start to start the game!", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 16);
  1894.                 canvas.drawString(jjSubscreenWidth / 2, 188, "Hint: Use mouse to freely view the map!", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  1895.         }
  1896.        
  1897.         int isTSFintCoin;
  1898.        
  1899.         if (jjIsTSF) isTSFintCoin = 4;
  1900.         else isTSFintCoin = 0;
  1901.        
  1902.         if (inGame && !gameEnded) {
  1903.                 canvas.drawSprite(jjSubscreenWidth - 66, 74, 67 + isTSFintCoin, 84, 0, 0);
  1904.                
  1905.                 if (play.coins >= 0) canvas.drawString(jjSubscreenWidth - 54, 80, "x" + play.coins);
  1906.                 else canvas.drawString(jjSubscreenWidth - 54, 80, "||x" + play.coins);
  1907.                
  1908.                 string roundString = "Round: ";
  1909.                
  1910.                 if (roundsArray[roundLimitInt] != 0) roundString = "Round: " + round + "/" + roundsArray[roundLimitInt];
  1911.                 else roundString = "Round: " + round;
  1912.                
  1913.                 uint length = roundString.length();
  1914.                
  1915.                 canvas.drawString(jjSubscreenWidth - length * 12, 96, roundString);
  1916.         }
  1917.        
  1918.         if (printSquare) {
  1919.                 Square thisSquare = squares[squareID];
  1920.                 int rent = thisSquare.rent;
  1921.                 string rentString;
  1922.                 if (rent == 0) rentString = "";
  1923.                 else rentString = "Rent: " + rent + " coins.";
  1924.                
  1925.                 canvas.drawString(jjSubscreenWidth / 2, 164, "You've hit " + thisSquare.name, STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  1926.                 canvas.drawString(jjSubscreenWidth / 2, 212, squareFunction, STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  1927.                 canvas.drawString(jjSubscreenWidth / 2, 236, squareAction, STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 16);
  1928.                 canvas.drawString(jjSubscreenWidth / 2, 260, squarePrice, STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  1929.                 canvas.drawString(jjSubscreenWidth / 2, 284, rentString, STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 16);
  1930.                
  1931.                 if (buyable) {
  1932.                         if (selectionPos == 0) {
  1933.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "Yes", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  1934.                                 canvas.drawString(jjSubscreenWidth / 2, 400, "No", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1935.                                 canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1936.                         }
  1937.                        
  1938.                         else if (selectionPos == 1) {
  1939.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "Yes", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1940.                                 canvas.drawString(jjSubscreenWidth / 2, 400, "No", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  1941.                                 canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1942.                         }
  1943.                        
  1944.                         else if (selectionPos == 2) {
  1945.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "Yes", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1946.                                 canvas.drawString(jjSubscreenWidth / 2, 400, "No", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1947.                                 canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  1948.                         }
  1949.                 }
  1950.                
  1951.                 if (requestJailMoney) {
  1952.                         if (selectionPos == 0) {
  1953.                                 canvas.drawString(jjSubscreenWidth / 2, 292, "Pay 15 Coins", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  1954.                                 canvas.drawString(jjSubscreenWidth / 2, 328, "Don't Pay", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1955.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1956.                                
  1957.                                 jjTEXTAPPEARANCE darkText(STRING::DARK);
  1958.                                 darkText.align = STRING::CENTER;
  1959.                                
  1960.                                 if (players[yourPlayerNo].hasWildCard) canvas.drawString(jjSubscreenWidth / 2, 400, "Use wild card", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1961.                                 else canvas.drawString(jjSubscreenWidth / 2, 400, "Use wild card", STRING::SMALL, darkText, 0, SPRITE::BRIGHTNESS, 64);
  1962.                         }
  1963.                        
  1964.                         else if (selectionPos == 1) {
  1965.                                 canvas.drawString(jjSubscreenWidth / 2, 292, "Pay 15 Coins", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1966.                                 canvas.drawString(jjSubscreenWidth / 2, 328, "Don't Pay", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  1967.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1968.                                
  1969.                                 jjTEXTAPPEARANCE darkText(STRING::DARK);
  1970.                                 darkText.align = STRING::CENTER;
  1971.                                
  1972.                                 if (players[yourPlayerNo].hasWildCard) canvas.drawString(jjSubscreenWidth / 2, 400, "Use wild card", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1973.                                 else canvas.drawString(jjSubscreenWidth / 2, 400, "Use wild card", STRING::SMALL, darkText, 0, SPRITE::BRIGHTNESS, 64);
  1974.                         }
  1975.                        
  1976.                         else if (selectionPos == 2) {
  1977.                                 canvas.drawString(jjSubscreenWidth / 2, 292, "Pay 15 Coins", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1978.                                 canvas.drawString(jjSubscreenWidth / 2, 328, "Don't Pay", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1979.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "View Map", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  1980.                                
  1981.                                 jjTEXTAPPEARANCE darkText(STRING::DARK);
  1982.                                 darkText.align = STRING::CENTER;
  1983.                                
  1984.                                 if (players[yourPlayerNo].hasWildCard) canvas.drawString(jjSubscreenWidth / 2, 400, "Use wild card", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1985.                                 else canvas.drawString(jjSubscreenWidth / 2, 400, "Use wild card", STRING::SMALL, darkText, 0, SPRITE::BRIGHTNESS, 64);
  1986.                         }
  1987.                        
  1988.                         else if (selectionPos == 3) {
  1989.                                 canvas.drawString(jjSubscreenWidth / 2, 292, "Pay 15 Coins", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1990.                                 canvas.drawString(jjSubscreenWidth / 2, 328, "Don't Pay", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1991.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  1992.                                
  1993.                                 canvas.drawString(jjSubscreenWidth / 2, 400, "Use wild card", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  1994.                         }
  1995.                 }
  1996.         }
  1997.        
  1998.         if (isTurn && waitForChance) {
  1999.                 canvas.drawResizedSprite(jjSubscreenWidth / 2, 380, ANIM::DOOR, 0, animFrame, 4, 4);
  2000.                
  2001.                 if (drawMark) {
  2002.                         canvas.drawString(jjSubscreenWidth / 2, 340, "?", STRING::LARGE, centeredText, 0, SPRITE::PALSHIFT, 8);
  2003.                 }
  2004.         }
  2005.        
  2006.         if (isTurn && waitForCC) {
  2007.                 if (drawMark) {
  2008.                         canvas.drawString(jjSubscreenWidth / 2, marky, "?", STRING::LARGE, centeredText, 0, SPRITE::PALSHIFT, 8);
  2009.                 }
  2010.                
  2011.                 canvas.drawResizedSprite(jjSubscreenWidth / 2, 380, ANIM::BIGBOX, 0, 0, 2, 2);
  2012.         }
  2013.        
  2014.         if (!gameEnded && isTurn && preAction && !viewMap && !selling && !upgrading) {
  2015.                 canvas.drawString(jjSubscreenWidth / 2, 164, "Round " + round, STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 16);
  2016.                 canvas.drawString(jjSubscreenWidth / 2, 188, "First Phase", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  2017.                
  2018.                 if (selectionPos == 0) {
  2019.                         canvas.drawString(jjSubscreenWidth / 2, 364, "Roll The Dice", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2020.                         canvas.drawString(jjSubscreenWidth / 2, 396, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2021.                         canvas.drawString(jjSubscreenWidth / 2, 428, "Sell Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2022.                         canvas.drawString(jjSubscreenWidth / 2, 460, "Upgrade Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2023.                 }
  2024.        
  2025.                 else if (selectionPos == 1) {
  2026.                         canvas.drawString(jjSubscreenWidth / 2, 364, "Roll The Dice", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2027.                         canvas.drawString(jjSubscreenWidth / 2, 396, "View Map", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2028.                         canvas.drawString(jjSubscreenWidth / 2, 428, "Sell Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2029.                         canvas.drawString(jjSubscreenWidth / 2, 460, "Upgrade Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2030.                 }
  2031.                
  2032.                 else if (selectionPos == 2) {
  2033.                         canvas.drawString(jjSubscreenWidth / 2, 364, "Roll The Dice", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2034.                         canvas.drawString(jjSubscreenWidth / 2, 396, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2035.                         canvas.drawString(jjSubscreenWidth / 2, 428, "Sell Properties", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2036.                         canvas.drawString(jjSubscreenWidth / 2, 460, "Upgrade Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2037.                 }
  2038.                
  2039.                 else if (selectionPos == 3) {
  2040.                         canvas.drawString(jjSubscreenWidth / 2, 364, "Roll The Dice", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2041.                         canvas.drawString(jjSubscreenWidth / 2, 396, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2042.                         canvas.drawString(jjSubscreenWidth / 2, 428, "Sell Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2043.                         canvas.drawString(jjSubscreenWidth / 2, 460, "Upgrade Properties", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2044.                 }
  2045.         }
  2046.        
  2047.         if (isTurn && midAction && !viewMap && !selling && bought && !upgrading) {
  2048.                 Square thisSquare = squares[squareID];
  2049.                 canvas.drawString(jjSubscreenWidth / 2, 164, "You've bought " + thisSquare.name, STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 16);
  2050.                 canvas.drawString(jjSubscreenWidth / 2, 188, "You now have " + play.coins + " coins.", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  2051.         }
  2052.        
  2053.         if (printChance) {
  2054.                 canvas.drawString(jjSubscreenWidth / 2, 164, c1, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2055.                 canvas.drawString(jjSubscreenWidth / 2, 180, c2, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2056.                 canvas.drawString(jjSubscreenWidth / 2, 196, c3, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2057.         }
  2058.                
  2059.         if (printCC) {
  2060.                 canvas.drawString(jjSubscreenWidth / 2, 164, c1, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2061.                 canvas.drawString(jjSubscreenWidth / 2, 180, c2, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2062.                 canvas.drawString(jjSubscreenWidth / 2, 196, c3, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2063.                
  2064.                 if (spaceTroll) {
  2065.                         if (selectionPos == 0) {
  2066.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "Pay 10 Coins", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2067.                                 canvas.drawString(jjSubscreenWidth / 2, 400, "Draw a Chance Card", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2068.                                 canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2069.                         }
  2070.                        
  2071.                         if (selectionPos == 1) {
  2072.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "Pay 10 Coins", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2073.                                 canvas.drawString(jjSubscreenWidth / 2, 400, "Draw a Chance Card", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2074.                                 canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2075.                         }
  2076.                        
  2077.                         if (selectionPos == 2) {
  2078.                                 canvas.drawString(jjSubscreenWidth / 2, 364, "Pay 10 Coins", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2079.                                 canvas.drawString(jjSubscreenWidth / 2, 400, "Draw a Chance Card", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2080.                                 canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2081.                         }
  2082.                 }
  2083.         }
  2084.        
  2085.         if (printOK && !giveCoins && !takeCoins && !spaceTroll) {
  2086.                 canvas.drawString(jjSubscreenWidth / 2, 364, "OK", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2087.         }
  2088.        
  2089.         if (isTurn && postAction && !viewMap && !selling && !upgrading) {
  2090.                 canvas.drawString(jjSubscreenWidth / 2, 164, "Round " + round, STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 16);
  2091.                 canvas.drawString(jjSubscreenWidth / 2, 188, "Second Phase", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  2092.                
  2093.                 if (selectionPos == 0) {
  2094.                         canvas.drawString(jjSubscreenWidth / 2, 364, "End Turn", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2095.                         canvas.drawString(jjSubscreenWidth / 2, 396, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2096.                         canvas.drawString(jjSubscreenWidth / 2, 428, "Sell Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2097.                         canvas.drawString(jjSubscreenWidth / 2, 460, "Upgrade Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2098.                 }
  2099.        
  2100.                 else if (selectionPos == 1) {
  2101.                         canvas.drawString(jjSubscreenWidth / 2, 364, "End Turn", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2102.                         canvas.drawString(jjSubscreenWidth / 2, 396, "View Map", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2103.                         canvas.drawString(jjSubscreenWidth / 2, 428, "Sell Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2104.                         canvas.drawString(jjSubscreenWidth / 2, 460, "Upgrade Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2105.                 }
  2106.                
  2107.                 else if (selectionPos == 2) {
  2108.                         canvas.drawString(jjSubscreenWidth / 2, 364, "End Turn", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2109.                         canvas.drawString(jjSubscreenWidth / 2, 396, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2110.                         canvas.drawString(jjSubscreenWidth / 2, 428, "Sell Properties", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2111.                         canvas.drawString(jjSubscreenWidth / 2, 460, "Upgrade Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2112.                 }
  2113.                
  2114.                 else if (selectionPos == 3) {
  2115.                         canvas.drawString(jjSubscreenWidth / 2, 364, "End Turn", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2116.                         canvas.drawString(jjSubscreenWidth / 2, 396, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2117.                         canvas.drawString(jjSubscreenWidth / 2, 428, "Sell Properties", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2118.                         canvas.drawString(jjSubscreenWidth / 2, 460, "Upgrade Properties", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2119.                 }
  2120.         }
  2121.        
  2122.         if (promptWildCard) {
  2123.                 canvas.drawString(jjSubscreenWidth / 2, 164, "You hold a wild card for JAIL!", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 16);
  2124.                 canvas.drawString(jjSubscreenWidth / 2, 188, "Do you want to use it now to get free?", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 24);
  2125.                
  2126.                 if (selectionPos == 0) {
  2127.                         canvas.drawString(jjSubscreenWidth / 2, 364, "Yes", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2128.                         canvas.drawString(jjSubscreenWidth / 2, 400, "No", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2129.                         canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2130.                 }
  2131.                
  2132.                 if (selectionPos == 1) {
  2133.                         canvas.drawString(jjSubscreenWidth / 2, 364, "Yes", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2134.                         canvas.drawString(jjSubscreenWidth / 2, 400, "No", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2135.                         canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2136.                 }
  2137.                
  2138.                 if (selectionPos == 2) {
  2139.                         canvas.drawString(jjSubscreenWidth / 2, 364, "Yes", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2140.                         canvas.drawString(jjSubscreenWidth / 2, 400, "No", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2141.                         canvas.drawString(jjSubscreenWidth / 2, 436, "View Map", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2142.                 }
  2143.         }
  2144.        
  2145.         if (selling) {
  2146.                 for (uint u = 0; u < players[yourPlayerNo].ownedSquares.length(); u++) {
  2147.                         if (u % 2 == 0) {
  2148.                                 string squareName = squares[players[yourPlayerNo].ownedSquares[u]].name;
  2149.                                 string squareRent = squares[players[yourPlayerNo].ownedSquares[u]].rent;
  2150.                                 string sellPrice = squares[players[yourPlayerNo].ownedSquares[u]].sellPrice;
  2151.                                 string level = squares[players[yourPlayerNo].ownedSquares[u]].rentLevel;
  2152.                                 canvas.drawString(jjSubscreenWidth / 16 * 3, 216 + u * 16, "" + squareName, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2153.                                 canvas.drawString(jjSubscreenWidth / 16 * 7, 216 + u * 16, "" + squareRent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2154.                                 canvas.drawString(jjSubscreenWidth / 16 * 10, 216 + u * 16, "" + sellPrice, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2155.                                 canvas.drawString(jjSubscreenWidth / 16 * 14, 216 + u * 16, "" + level, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2156.                         }
  2157.                        
  2158.                         else {
  2159.                                 string squareName = squares[players[yourPlayerNo].ownedSquares[u]].name;
  2160.                                 string squareRent = squares[players[yourPlayerNo].ownedSquares[u]].rent;
  2161.                                 string sellPrice = squares[players[yourPlayerNo].ownedSquares[u]].sellPrice;
  2162.                                 string level = squares[players[yourPlayerNo].ownedSquares[u]].rentLevel;
  2163.                                 canvas.drawString(jjSubscreenWidth / 16 * 3, 216 + u * 16, "" + squareName, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2164.                                 canvas.drawString(jjSubscreenWidth / 16 * 7, 216 + u * 16, "" + squareRent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2165.                                 canvas.drawString(jjSubscreenWidth / 16 * 10, 216 + u * 16, "" + sellPrice, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2166.                                 canvas.drawString(jjSubscreenWidth / 16 * 14, 216 + u * 16, "" + level, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2167.                         }
  2168.                 }
  2169.                
  2170.                 if (selectionPos == 0) {
  2171.                         canvas.drawString(jjSubscreenWidth / 2, 164, "BACK", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2172.                        
  2173.                         canvas.drawString(jjSubscreenWidth / 16 * 3, 200, "Name", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2174.                         canvas.drawString(jjSubscreenWidth / 16 * 7, 200, "Rent", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2175.                         canvas.drawString(jjSubscreenWidth / 16 * 10, 200, "Selling Price", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2176.                         canvas.drawString(jjSubscreenWidth / 16 * 14, 200, "Level", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2177.                 }
  2178.                
  2179.                 else if (selectionPos > 0) {
  2180.                         canvas.drawString(jjSubscreenWidth / 2, 164, "BACK", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2181.                        
  2182.                         canvas.drawString(jjSubscreenWidth / 16 * 3, 200, "Name", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2183.                         canvas.drawString(jjSubscreenWidth / 16 * 7, 200, "Rent", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2184.                         canvas.drawString(jjSubscreenWidth / 16 * 10, 200, "Selling Price", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2185.                         canvas.drawString(jjSubscreenWidth / 16 * 14, 200, "Level", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2186.                        
  2187.                         int isTSFintArrow;
  2188.                         string squareName = squares[players[yourPlayerNo].ownedSquares[selectionPos - 1]].name;
  2189.                         string level = squares[players[yourPlayerNo].ownedSquares[selectionPos - 1]].rentLevel;
  2190.                        
  2191.                         uint nameLength = squareName.length();
  2192.                         uint levelLength = level.length();
  2193.                        
  2194.                         if (jjIsTSF) isTSFintArrow = 1;
  2195.                         else isTSFintArrow = 0;
  2196.                        
  2197.                         canvas.drawRotatedSprite(jjSubscreenWidth / 16 * 3 - nameLength / 2 * 15, 196 + selectionPos * 16, 43 + isTSFintArrow, 0, 1, 950, 1, 1, SPRITE::NORMAL);
  2198.                         canvas.drawRotatedSprite(jjSubscreenWidth / 16 * 15 + levelLength / 2 * 48, 196 + selectionPos * 16, 43 + isTSFintArrow, 0, 1, 445, 1, 1, SPRITE::NORMAL);
  2199.                 }
  2200.         }
  2201.        
  2202.         if (upgrading) {
  2203.                 for (uint u = 0; u < players[yourPlayerNo].ownedSquares.length(); u++) {
  2204.                         if (u % 2 == 0) {
  2205.                                 string squareName = squares[players[yourPlayerNo].ownedSquares[u]].name;
  2206.                                 string squareRent = squares[players[yourPlayerNo].ownedSquares[u]].rent;
  2207.                                 string upPrice = squares[players[yourPlayerNo].ownedSquares[u]].upPrice;
  2208.                                 string level = squares[players[yourPlayerNo].ownedSquares[u]].rentLevel;
  2209.                                 canvas.drawString(jjSubscreenWidth / 16 * 3, 216 + u * 16, "" + squareName, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2210.                                 canvas.drawString(jjSubscreenWidth / 16 * 7, 216 + u * 16, "" + squareRent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2211.                                 canvas.drawString(jjSubscreenWidth / 16 * 10, 216 + u * 16, "" + upPrice, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2212.                                 canvas.drawString(jjSubscreenWidth / 16 * 14, 216 + u * 16, "" + level, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2213.                         }
  2214.                        
  2215.                         else {
  2216.                                 string squareName = squares[players[yourPlayerNo].ownedSquares[u]].name;
  2217.                                 string squareRent = squares[players[yourPlayerNo].ownedSquares[u]].rent;
  2218.                                 string upPrice = squares[players[yourPlayerNo].ownedSquares[u]].upPrice;
  2219.                                 string level = squares[players[yourPlayerNo].ownedSquares[u]].rentLevel;
  2220.                                 canvas.drawString(jjSubscreenWidth / 16 * 3, 216 + u * 16, "" + squareName, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2221.                                 canvas.drawString(jjSubscreenWidth / 16 * 7, 216 + u * 16, "" + squareRent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2222.                                 canvas.drawString(jjSubscreenWidth / 16 * 10, 216 + u * 16, "" + upPrice, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2223.                                 canvas.drawString(jjSubscreenWidth / 16 * 14, 216 + u * 16, "" + level, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2224.                         }
  2225.                 }
  2226.                
  2227.                 if (selectionPos == 0) {
  2228.                         canvas.drawString(jjSubscreenWidth / 2, 164, "BACK", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);
  2229.                        
  2230.                         canvas.drawString(jjSubscreenWidth / 16 * 3, 200, "Name", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2231.                         canvas.drawString(jjSubscreenWidth / 16 * 7, 200, "Rent", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2232.                         canvas.drawString(jjSubscreenWidth / 16 * 10, 200, "Upgrading Price", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2233.                         canvas.drawString(jjSubscreenWidth / 16 * 14, 200, "Level", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2234.                 }
  2235.                
  2236.                 else if (selectionPos > 0) {
  2237.                         canvas.drawString(jjSubscreenWidth / 2, 164, "BACK", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 8);
  2238.                        
  2239.                         canvas.drawString(jjSubscreenWidth / 16 * 3, 200, "Name", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2240.                         canvas.drawString(jjSubscreenWidth / 16 * 7, 200, "Rent", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2241.                         canvas.drawString(jjSubscreenWidth / 16 * 10, 200, "Upgrading Price", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2242.                         canvas.drawString(jjSubscreenWidth / 16 * 14, 200, "Level", STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 0);
  2243.                        
  2244.                         int isTSFintArrow;
  2245.                         string squareName = squares[players[yourPlayerNo].ownedSquares[selectionPos - 1]].name;
  2246.                         string level = squares[players[yourPlayerNo].ownedSquares[selectionPos - 1]].rentLevel;
  2247.                        
  2248.                         uint nameLength = squareName.length();
  2249.                         uint levelLength = level.length();
  2250.                        
  2251.                         if (jjIsTSF) isTSFintArrow = 1;
  2252.                         else isTSFintArrow = 0;
  2253.                        
  2254.                         canvas.drawRotatedSprite(jjSubscreenWidth / 16 * 3 - nameLength / 2 * 15, 196 + selectionPos * 16, 43 + isTSFintArrow, 0, 1, 950, 1, 1, SPRITE::NORMAL);
  2255.                         canvas.drawRotatedSprite(jjSubscreenWidth / 16 * 15 + levelLength / 2 * 48, 196 + selectionPos * 16, 43 + isTSFintArrow, 0, 1, 445, 1, 1, SPRITE::NORMAL);
  2256.                 }
  2257.         }
  2258.        
  2259.         if (confirmation) {
  2260.                 for (uint u = 0; u < players[yourPlayerNo].ownedSquares.length(); u++) {
  2261.                         if (u % 2 == 0) {
  2262.                                 string squareName = squares[players[yourPlayerNo].ownedSquares[u]].name;
  2263.                                 string squareRent = squares[players[yourPlayerNo].ownedSquares[u]].rent;
  2264.                                 string sellPrice = squares[players[yourPlayerNo].ownedSquares[u]].sellPrice;
  2265.                                 string level = squares[players[yourPlayerNo].ownedSquares[u]].rentLevel;
  2266.                                 canvas.drawString(jjSubscreenWidth / 16 * 3, 216 + u * 16, "" + squareName, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2267.                                 canvas.drawString(jjSubscreenWidth / 16 * 7, 216 + u * 16, "" + squareRent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2268.                                 canvas.drawString(jjSubscreenWidth / 16 * 10, 216 + u * 16, "" + sellPrice, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2269.                                 canvas.drawString(jjSubscreenWidth / 16 * 14, 216 + u * 16, "" + level, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 16);
  2270.                         }
  2271.                        
  2272.                         else {
  2273.                                 string squareName = squares[players[yourPlayerNo].ownedSquares[u]].name;
  2274.                                 string squareRent = squares[players[yourPlayerNo].ownedSquares[u]].rent;
  2275.                                 string sellPrice = squares[players[yourPlayerNo].ownedSquares[u]].sellPrice;
  2276.                                 string level = squares[players[yourPlayerNo].ownedSquares[u]].rentLevel;
  2277.                                 canvas.drawString(jjSubscreenWidth / 16 * 3, 216 + u * 16, "" + squareName, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2278.                                 canvas.drawString(jjSubscreenWidth / 16 * 7, 216 + u * 16, "" + squareRent, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2279.                                 canvas.drawString(jjSubscreenWidth / 16 * 10, 216 + u * 16, "" + sellPrice, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2280.                                 canvas.drawString(jjSubscreenWidth / 16 * 14, 216 + u * 16, "" + level, STRING::SMALL, centeredText, 0, SPRITE::PALSHIFT, 24);
  2281.                         }
  2282.                 }
  2283.                
  2284.                 if (selectionPos == 0) {
  2285.                         canvas.drawString(jjSubscreenWidth / 2, 164, "BACK", STRING::MEDIUM, centeredText, 0, SPRITE::PALSHIFT, 8);