├── Kirsty's Kill Counter v.1.0 ├── Loot Generator v1.0.2 ├── Modern Calendar v2.0.js ├── Faerun Calendar v2.0.js ├── Faerun Calendar v2.1.js ├── Faerun Calendar v2.2 ├── Faerun Calendar v2.3 ├── Faerun Calendar v2.4 ├── Greyhawk Calendar v2.0.js ├── Magic Store v2.0.0 └── Multi-World Calendar v3.0.0 /Kirsty's Kill Counter v.1.0: -------------------------------------------------------------------------------- 1 | // Kill counter using the OGL sheet 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | // API Commands: 5 | // !killCount 6 | 7 | var KillCount = KillCount || (function() { 8 | 'use strict'; 9 | 10 | var version = '1.0', 11 | 12 | handleInput = function(msg) { 13 | var args = msg.content.split(","); 14 | 15 | if (msg.type !== "api") { 16 | return; 17 | } 18 | 19 | switch(args[0]) { 20 | case '!killCount': 21 | menu(msg); 22 | break; 23 | case '!addPlayer': 24 | addPlayer(args[1]); 25 | break; 26 | case '!addKill': 27 | addKill(msg); 28 | break; 29 | } 30 | 31 | }, 32 | 33 | menu = function(msg) { 34 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 35 | var headstyle = 'style="color: rgb(0, 153, 255); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 36 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 37 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(0, 153, 255); margin-bottom: 2px; margin-top: 2px;"'; 38 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #0099FF; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 39 | var tablestyle = 'style="text-align:center;"'; 40 | var who = msg.who.split(" "); 41 | var name = who[0]; 42 | 43 | sendChat('Kill Counter', '/w ' + name + '
' + //-- 44 | '
Kirsty\'s Kill Counter
' + //-- 45 | '
Menu
' + //-- 46 | '
' + //-- 47 | '' + //-- 48 | '' + //-- 49 | '' + //-- 50 | '
Add Player
Add Kill
' 51 | ); 52 | 53 | }, 54 | 55 | addPlayer = function(pname){ 56 | var pname; 57 | var CountSheet = findObjs({ 58 | type: "character", 59 | name: "KillCount" 60 | })[0]; 61 | 62 | var types = ["Aberration", "Beast", "Celestial", "Construct", "Dragon", "Elemental", "Fey", "Fiend", "Giant", "Humanoid", "Monstrosity", "Ooze", "Plant", "Undead"]; 63 | var i; 64 | 65 | createObj('attribute', { 66 | name: pname, 67 | current: 0, 68 | characterid: CountSheet.id 69 | }); 70 | 71 | for (i = 0; i < types.length; i++) { 72 | createObj('attribute', { 73 | name: pname + '_' + types[i], 74 | current: 0, 75 | characterid: CountSheet.id 76 | }); 77 | } 78 | 79 | sendChat('Kill Counter', pname + ' has been added.'); 80 | }, 81 | 82 | addKill = function(msg) { 83 | 84 | var args = msg.content.split(","); 85 | var att = args[1]+'_'+args[2]; 86 | var CountSheet = findObjs({ 87 | type: "character", 88 | name: "KillCount" 89 | })[0]; 90 | var curr = findObjs({type:'attribute', characterid: CountSheet.id, name: att})[0]; 91 | var currValue = curr.get('current'); 92 | var newValue = Number(currValue) + Number(args[3]); 93 | 94 | curr.set('current', newValue); 95 | 96 | var ptot = findObjs({type:'attribute', characterid: CountSheet.id, name: args[1]})[0]; 97 | var currpTot = ptot.get('current'); 98 | var newpTot = Number(currpTot) + Number(args[3]); 99 | 100 | ptot.set('current', newpTot); 101 | 102 | var tot = findObjs({type:'attribute', characterid: CountSheet.id, name: 'Total'})[0]; 103 | var currTot = tot.get('current'); 104 | var newTot = Number(currTot) + Number(args[3]); 105 | 106 | tot.set('current', newTot); 107 | 108 | sendChat('Kill Counter', args[1] + ' has ' + args[3] + ' more ' + args[2] + ' kills, for a total of ' + newValue); 109 | 110 | }, 111 | 112 | checkInstall = function() { 113 | // Check if the KillCount character sheet exists 114 | var CountSheet = findObjs({ 115 | type: "character", 116 | name: "KillCount" 117 | })[0]; 118 | 119 | if (!CountSheet) { 120 | CountSheet = createObj("character", { 121 | name: "KillCount" 122 | }); 123 | 124 | createObj('attribute', { 125 | name: 'Total', 126 | current: 0, 127 | characterid: CountSheet.id 128 | }); 129 | 130 | sendChat('Kill Counter', '/w gm A KillCount sheet has been added to your journal.'); 131 | }; 132 | }, 133 | 134 | registerEventHandlers = function() { 135 | on('chat:message', handleInput); 136 | }; 137 | 138 | return { 139 | CheckInstall: checkInstall, 140 | RegisterEventHandlers: registerEventHandlers 141 | }; 142 | 143 | }()); 144 | 145 | on("ready",function(){ 146 | 'use strict'; 147 | KillCount.CheckInstall(); 148 | KillCount.RegisterEventHandlers(); 149 | }); 150 | -------------------------------------------------------------------------------- /Loot Generator v1.0.2: -------------------------------------------------------------------------------- 1 | // Loot generator for D&D 5e 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | // API Commands: 5 | // !genLoot - Pulls up the menu and allows the GM to generate random loot 6 | 7 | // Red Colour: #7E2D40 8 | 9 | var LootGenerator = LootGenerator || (function() { 10 | 'use strict'; 11 | 12 | var version = '1.0.2', 13 | 14 | handleInput = function(msg) { 15 | var args = msg.content.split(","); 16 | 17 | if (msg.type !== "api") { 18 | return; 19 | } 20 | 21 | if(playerIsGM(msg.playerid)){ 22 | switch(args[0]) { 23 | case '!genLoot': 24 | lootMenu(); 25 | break; 26 | case '!showLoot': 27 | showLoot(msg); 28 | break; 29 | } 30 | } 31 | }, 32 | 33 | lootMenu = function() { 34 | var colour = '#7E2D40'; 35 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"'; 36 | var astyle1 = 'style="text-align:center; border: 1px solid black; margin: 1px; padding: 2px; background-color: ' + colour + '; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 100px;'; 37 | var astyle2 = 'style="text-align:center; border: 1px solid black; margin: 1px; padding: 2px; background-color: ' + colour + '; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 150px;'; 38 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid ' + colour + '; margin-bottom: 2px; margin-top: 2px;"'; 39 | var headstyle = 'style="color: ' + colour + '; font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 40 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -2px; font-style: italic;"'; 41 | 42 | sendChat('Loot Generator', '/w gm
' + //-- 43 | '
Loot Generator
' + //-- 44 | '
Menu (v.' + version + ')
' + //-- 45 | '
' + //-- 46 | '
Individual Loot
' + //-- 47 | '
' 48 | ); 49 | }, 50 | 51 | showLoot = function(msg) { 52 | var args = msg.content.split(","); 53 | var totalLoot; 54 | 55 | switch(args[1]) { 56 | case 'individual0': 57 | totalLoot = individual0(msg); 58 | break; 59 | case 'individual5': 60 | totalLoot = individual5(msg); 61 | break; 62 | case 'individual11': 63 | totalLoot = individual11(msg); 64 | break; 65 | case 'individual17': 66 | totalLoot = individual17(msg); 67 | break; 68 | } 69 | 70 | var colour = '#7E2D40'; 71 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 72 | var astyle1 = 'style="text-align:center; border: 1px solid black; margin: 1px; padding: 2px; background-color: ' + colour + '; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 100px;'; 73 | var astyle2 = 'style="text-align:center; border: 1px solid black; margin: 1px; padding: 2px; background-color: ' + colour + '; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 150px;'; 74 | var tablestyle ='style="text-align:center; font-size: 12px; width: 100%"'; 75 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid ' + colour + '; margin-bottom: 2px; margin-top: 2px;"'; 76 | var headstyle = 'style="color: ' + colour + '; font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 77 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -2px; font-style: italic;"'; 78 | var trstyle = 'style="border-top: 1px solid #cccccc;"'; 79 | var tdstyle1 = 'style="text-align: left; width: 60px;"'; 80 | var tdstyle2 = 'style="text-align: left; padding-right: 10px;"'; 81 | 82 | var coins = totalLoot.split(";"); 83 | var loot = ''; 84 | var i = 0; 85 | var n = coins.length - 1; 86 | 87 | for (i = 0; i < n; i ++) { 88 | var number = Number([i])+1 89 | loot += 'Enemy ' + number + '' + coins[i] + getItem() + ''; 90 | } 91 | 92 | loot += 'Total Coins' + coins[n] + ''; 93 | 94 | sendChat('Loot', '
' + //-- 95 | '
Loot
' + //-- 96 | '
' + //-- 97 | '' + //-- 98 | '' + //-- 99 | loot + //-- 100 | '
EnemyLoot
'+ //-- 101 | '
' 102 | ); 103 | }, 104 | 105 | getItem = function() { 106 | 107 | var itemList = 'lint,mouldy cheese,stale bread,fresh bread,a shiny rock,a tin ring,a six sided die,a twenty sided die,a letter opener,a letter,a braid of hair,a red ribbon,a button,sealing wax,a needle and thread,a fish hook,one earring,a miniature painting,a twisted fork,a boiled candy,a key,snuff,smelling salts,flint and steel,a quill,a paper fan,a pen-knife,a locket,a puzzle piece,a carved wooden wolf,a harmonica,a grocery list,a spoon,a piece of sea glass,a bit of copper wire,a painted rock,an acorn,a hankerchief,a thimble,a bit of fleece,a potion of healing,blue quartz (10 gp)'.split(","); 108 | 109 | var item = ''; 110 | var check = randomInteger(5); 111 | 112 | if (check<2){ 113 | var num = randomInteger(3); 114 | var i = 0; 115 | 116 | for (i = 0; i < num; i ++) { 117 | item += ', '; 118 | var roll = Number(randomInteger(itemList.length))-1; 119 | 120 | item += itemList[roll]; 121 | } 122 | } 123 | 124 | return item; 125 | }, 126 | 127 | individual0 = function(msg) { 128 | var args = msg.content.split(","); 129 | var noEnemies = args[2]; 130 | var loot = ''; 131 | var totpp = 0; 132 | var totgp = 0; 133 | var totep = 0; 134 | var totsp = 0; 135 | var totcp = 0; 136 | 137 | var i = 0; 138 | 139 | for (i = 0; i < noEnemies; i ++) { 140 | var roll = randomInteger(100); 141 | 142 | if (i>0){loot += ';'} 143 | 144 | if (roll<31){ 145 | var cp = randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6); 146 | totcp += cp; 147 | loot += cp + ' cp'; 148 | }else if (300){loot += ';'} 187 | 188 | if (roll<31){ 189 | var ep = randomInteger(6)*10; 190 | totep += ep; 191 | loot += ep + ' ep, '; 192 | var cp = (randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6))*100; 193 | totcp += cp; 194 | loot += cp + ' cp'; 195 | }else if (300){loot += ';'} 243 | 244 | if (roll<21){ 245 | var gp = randomInteger(6)*100; 246 | totgp += gp; 247 | loot += gp + ' gp, '; 248 | var sp = (randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6))*100; 249 | totsp += sp; 250 | loot += sp + ' sp'; 251 | }else if (200){loot += ';'} 295 | 296 | if (roll<16){ 297 | var gp = (randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6)+randomInteger(6))*100; 298 | totgp += gp; 299 | loot += gp + ' gp, '; 300 | var ep = (randomInteger(6)+randomInteger(6))*1000; 301 | totep += ep; 302 | loot += ep + ' ep'; 303 | }else if (15' + //-- 84 | '
Calendar
' + //-- 85 | '
Menu
' + //-- 86 | '
' + //-- 87 | '' + //-- 88 | '' + //-- 89 | '' + //-- 90 | '' + //-- 91 | '' + //-- 92 | '
Day: ' + day + '
Month: ' + month + '
Year: ' + state.Calendar.now.year + '
Ordinal: ' + state.Calendar.now.ordinal + '
' + //-- 93 | '
Weather: ' + state.Calendar.now.weather + //-- 94 | '

' + //-- 95 | '' + //-- 96 | '' + //-- 97 | '
' 98 | ); 99 | }, 100 | 101 | showcal = function(msg) { 102 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 103 | var month = nowdate[0]; 104 | var day = nowdate[1]; 105 | var suffix = getsuffix(day); 106 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 107 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 108 | var tablestyle = 'style="text-align:center;"'; 109 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 110 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 111 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 112 | 113 | sendChat(msg.who, '
' + //-- 114 | '
Calendar
' + //-- 115 | '
Player View
' + //-- 116 | '
' + //-- 117 | day + suffix + ' ' + month + ', ' + state.Calendar.now.year + //-- 118 | '

Today\'s weather:
' + state.Calendar.now.weather 119 | ); 120 | }, 121 | 122 | getdate = function(options){ 123 | var day = Number(options); 124 | var date; 125 | var month; 126 | 127 | if(day>0 && day<=31){ 128 | month="January"; 129 | date=day; 130 | }else if(day>31 && day<=59){ 131 | month="February"; 132 | date=day-31; 133 | }else if(day>59 && day<=90){ 134 | month="March"; 135 | date=day-59; 136 | }else if(day>90 && day<=120){ 137 | month="April"; 138 | date=day-90; 139 | }else if(day>120 && day<=151){ 140 | month="May"; 141 | date=day-120; 142 | }else if(day>151 && day<=181){ 143 | month="June"; 144 | date=day-151; 145 | }else if(day>181 && day<=212){ 146 | month="July"; 147 | date=day-181; 148 | }else if(day>212 && day<=243){ 149 | month="August"; 150 | date=day-212; 151 | }else if(day>243 && day<=273){ 152 | month="September"; 153 | date=day-243; 154 | }else if(day>273 && day<=304){ 155 | month="October"; 156 | date=day-273; 157 | }else if(day>304 && day<=334){ 158 | month="November" 159 | date=day-304; 160 | }else if(day>334 && day<=365){ 161 | month="December"; 162 | date=day-334; 163 | }else{ 164 | month="January"; 165 | date='1'; 166 | } 167 | 168 | var array=month+','+String(date); 169 | return array; 170 | }, 171 | 172 | getordinal = function(options){ 173 | var args = options.content.split(","); 174 | var date = Number(args[1]); 175 | var month = args[2]; 176 | var ordinal = state.Calendar.now.ordinal; 177 | 178 | switch(month) { 179 | case 'January': 180 | ordinal = date; 181 | break; 182 | case 'February': 183 | ordinal = 31+date; 184 | break; 185 | case 'March': 186 | ordinal = 59+date; 187 | break; 188 | case 'April': 189 | ordinal = 90+date; 190 | break; 191 | case 'May': 192 | ordinal = 120+date; 193 | break; 194 | case 'June': 195 | ordinal = 151+date; 196 | break; 197 | case 'July': 198 | ordinal = 181+date; 199 | break; 200 | case 'August': 201 | ordinal = 212+date; 202 | break; 203 | case 'September': 204 | ordinal = 243+date; 205 | break; 206 | case 'October': 207 | ordinal = 273+date; 208 | break; 209 | case 'November': 210 | ordinal = 304+date; 211 | break; 212 | case 'December': 213 | ordinal = 365+date; 214 | break; 215 | } 216 | state.Calendar.now.ordinal = ordinal; 217 | }, 218 | 219 | getsuffix = function(day) { 220 | 221 | var date = Number(day) 222 | var suffix 223 | 224 | if (date == 1 || date == 21 ){ 225 | suffix = 'st'; 226 | }else if (date == 2 || date == 22){ 227 | suffix = 'nd'; 228 | }else if (date == 3 || date == 23){ 229 | suffix = 'rd'; 230 | }else{ 231 | suffix = 'th'; 232 | } 233 | 234 | return suffix; 235 | }, 236 | 237 | addday = function(add) { 238 | var ordinal = Number(add) 239 | ordinal = ordinal + Number(state.Calendar.now.ordinal); 240 | 241 | if(ordinal>365){ 242 | ordinal=ordinal-365; 243 | state.Calendar.now.year = Number(state.Calendar.now.year)+1; 244 | } 245 | 246 | state.Calendar.now.ordinal = ordinal; 247 | }, 248 | 249 | weather = function() { 250 | var roll; 251 | var temperature; 252 | var wind; 253 | var precipitation; 254 | var season; 255 | var ordinal = state.Calendar.now.ordinal; 256 | 257 | if(ordinal > 334 || ordinal <= 90){ 258 | season = 'Winter' 259 | }else if(ordinal > 90 && ordinal <= 151 ){ 260 | season = 'Spring' 261 | }else if(ordinal > 151 && ordinal <= 243 ){ 262 | season = 'Summer' 263 | }else if(ordinal > 243 && ordinal <= 334 ){ 264 | season = 'Fall' 265 | } 266 | 267 | roll = Math.floor(Math.random()*(20-1+1)+1); 268 | if(roll>=15 && roll<=17){ 269 | switch(season) { 270 | case 'Winter': 271 | temperature = 'It is a bitterly cold winter day. '; 272 | break; 273 | case 'Spring': 274 | temperature = 'It is a cold spring day. '; 275 | break; 276 | case 'Summer': 277 | temperature = 'It is a cool summer day. '; 278 | break; 279 | case 'Fall': 280 | temperature = 'It is a cold fall day. '; 281 | break; 282 | } 283 | }else if(roll>=18 && roll<=20){ 284 | switch(season) { 285 | case 'Winter': 286 | temperature = 'It is a warm winter day. '; 287 | break; 288 | case 'Spring': 289 | temperature = 'It is a hot spring day. '; 290 | break; 291 | case 'Summer': 292 | temperature = 'It is a blisteringly hot summer day. '; 293 | break; 294 | case 'Fall': 295 | temperature = 'It is a hot fall day. '; 296 | break; 297 | } 298 | }else{ 299 | switch(season) { 300 | case 'Winter': 301 | temperature = 'It is a cold winter day. '; 302 | break; 303 | case 'Spring': 304 | temperature = 'It is a mild spring day. '; 305 | break; 306 | case 'Summer': 307 | temperature = 'It is a hot summer day. '; 308 | break; 309 | case 'Fall': 310 | temperature = 'It is a mild fall day. '; 311 | break; 312 | } 313 | 314 | } 315 | 316 | roll = Math.floor(Math.random()*(20-1+1)+1); 317 | if(roll>=15 && roll<=17){ 318 | wind='There is a light breeze and '; 319 | }else if(roll>=18 && roll<=20){ 320 | wind='There is a howling wind and '; 321 | }else{ 322 | wind='The air is still and '; 323 | } 324 | 325 | roll = Math.floor(Math.random()*(20-1+1)+1); 326 | if(roll>=15 && roll<=17){ 327 | precipitation="Light rain or snow."; 328 | if(season=='Winter'){ 329 | precipitation = 'snow falls softly on the ground.'; 330 | }else{ 331 | precipitation = 'a light rain falls from the sky.'; 332 | } 333 | }else if(roll>=18 && roll<=20){ 334 | if(season=='Winter'){ 335 | precipitation = 'snow falls thick and fast from the sky.'; 336 | }else{ 337 | precipitation = 'a torrential rain begins to fall.'; 338 | } 339 | }else{ 340 | roll = Math.floor(Math.random()*(2-1+1)+1); 341 | if(roll=1){ 342 | precipitation = 'the sky is overcast.'; 343 | }else{ 344 | precipitation = 'the sky is clear.'; 345 | } 346 | } 347 | 348 | var forecast=temperature+wind+precipitation; 349 | state.Calendar.now.weather = forecast; 350 | }, 351 | 352 | checkInstall = function() { 353 | // Check if the Calendar property exists, creating it if it doesn't 354 | if( ! state.Calendar ) { 355 | setDefaults(); 356 | } 357 | }, 358 | 359 | registerEventHandlers = function() { 360 | on('chat:message', handleInput); 361 | }; 362 | 363 | return { 364 | CheckInstall: checkInstall, 365 | RegisterEventHandlers: registerEventHandlers 366 | }; 367 | 368 | }()); 369 | 370 | on("ready",function(){ 371 | 'use strict'; 372 | Calendar.CheckInstall(); 373 | Calendar.RegisterEventHandlers(); 374 | }); 375 | -------------------------------------------------------------------------------- /Faerun Calendar v2.0.js: -------------------------------------------------------------------------------- 1 | // Calendar and down day counter for Faerun 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | // API Commands: 5 | // !cal - for the GM displays the menu in the chat window, for a player displays date, weather and down days 6 | 7 | // Red Colour: #7E2D40 8 | 9 | var Calendar = Calendar || (function() { 10 | 'use strict'; 11 | 12 | var version = '0.1.0', 13 | 14 | setDefaults = function() { 15 | state.Calendar = { 16 | now: { 17 | ordinal: 1, 18 | year: 1486, 19 | down: 0, 20 | divider: 1, 21 | weather: "It is a cool but sunny day" 22 | }, 23 | }; 24 | }, 25 | 26 | handleInput = function(msg) { 27 | var args = msg.content.split(","); 28 | 29 | if (msg.type !== "api") { 30 | return; 31 | } 32 | 33 | if(playerIsGM(msg.playerid)){ 34 | switch(args[0]) { 35 | case '!cal': 36 | calmenu(); 37 | break; 38 | case '!setday': 39 | getordinal(msg); 40 | weather(); 41 | calmenu(); 42 | break; 43 | case '!setmonth': 44 | getordinal(msg); 45 | weather(); 46 | calmenu(); 47 | break; 48 | case '!setyear': 49 | state.Calendar.now.year=args[1]; 50 | calmenu(); 51 | break; 52 | case '!setordinal': 53 | state.Calendar.now.ordinal=args[1]; 54 | calmenu(); 55 | break; 56 | case '!setdown': 57 | var down = Number(args[1]); 58 | state.Calendar.now.down = down; 59 | getdown(down); 60 | calmenu(); 61 | break; 62 | case '!setdiv': 63 | state.Calendar.now.div=Number(args[1]); 64 | calmenu(); 65 | break; 66 | case '!addday': 67 | addday(args[1]); 68 | weather(); 69 | calmenu(); 70 | break; 71 | case '!weather': 72 | weather(); 73 | calmenu(); 74 | break; 75 | case '!playercal': 76 | showcal(msg); 77 | break; 78 | } 79 | }else if(args[0]=='!cal'){ 80 | showcal(msg); 81 | } 82 | }, 83 | 84 | calmenu = function() { 85 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40;border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 86 | var tablestyle = 'style="text-align:center;"'; 87 | var down = state.Calendar.now.down; 88 | down = getdown(down); 89 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 90 | var month = nowdate[0]; 91 | var day = nowdate[1]; 92 | 93 | sendChat('Calendar', '/w gm &{template:npcaction} {{rname=Calendar}} {{name=Menu}} {{description=' + //-- 94 | '' + //-- 95 | '' + //-- 96 | '' + //-- 97 | '' + //-- 98 | '' + //-- 99 | '' + //-- 100 | '
Day: ' + day + '
Month: ' + month + '
Year: ' + state.Calendar.now.year + '
Ordinal: ' + state.Calendar.now.ordinal + '
Down Days: ' + down + '
Down Day
Divider:
' + state.Calendar.now.div + '
' + //-- 101 | '
Weather: ' + state.Calendar.now.weather + //-- 102 | '

Advance the Date
' + //-- 103 | '
Roll Weather
' + //-- 104 | '
Show to Players
' + //-- 105 | '}}' 106 | ); 107 | }, 108 | 109 | showcal = function(msg) { 110 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 111 | var month = nowdate[0]; 112 | var day = nowdate[1]; 113 | var down = state.Calendar.now.down; 114 | down = getdown(down); 115 | var suffix = getsuffix(day); 116 | 117 | sendChat(msg.who, '&{template:npcaction} {{rname=Calendar}} {{name=Player View}} {{description=' + //-- 118 | day + suffix + ' ' + month + ', ' + state.Calendar.now.year + //-- 119 | '
Players have ' + down + ' down days.' + //-- 120 | '

Today\'s weather:
' + state.Calendar.now.weather + //-- 121 | '}}' 122 | ); 123 | }, 124 | 125 | getdate = function(options){ 126 | var day = Number(options); 127 | var date; 128 | var month; 129 | 130 | if(day>0 && day<=30){ 131 | month="Hammer"; 132 | date=day; 133 | }else if(day==31){ 134 | month="Midwinter"; 135 | date='festival'; 136 | }else if(day>31 && day<=61){ 137 | month="Alturiak"; 138 | date=day-31; 139 | }else if(day>61 && day<=91){ 140 | month="Ches"; 141 | date=day-61; 142 | }else if(day>91 && day<=121){ 143 | month="Tarsakh"; 144 | date=day-91; 145 | }else if(day==122){ 146 | month="Greengrass"; 147 | date='festival'; 148 | }else if(day>122 && day<=152){ 149 | month="Mirtul"; 150 | date=day-122; 151 | }else if(day>152 && day<=182){ 152 | month="Kythorn"; 153 | date=day-152; 154 | }else if(day>182 && day<=212){ 155 | month="Flamerule"; 156 | date=day-182; 157 | }else if(day==213){ 158 | month="Midsummer"; 159 | date='festival'; 160 | }else if(day>213 && day<=243){ 161 | month="Eleasias" 162 | date=day-213; 163 | }else if(day>243 && day<=273){ 164 | month="Eleint"; 165 | date=day-243; 166 | }else if(day==274){ 167 | month="Highharvestide"; 168 | date='festival'; 169 | }else if(day>274 && day<=304){ 170 | month="Marpenoth"; 171 | date=day-274; 172 | }else if(day>304 && day<=334){ 173 | month="Uktar"; 174 | date=day-304; 175 | }else if(day==335){ 176 | month="Feast of the Moon"; 177 | date='festival'; 178 | }else if(day>335 && day<=365){ 179 | month="Nightal"; 180 | date=day-335; 181 | }else{ 182 | month="Hammer"; 183 | date='1'; 184 | } 185 | 186 | var array=month+','+String(date); 187 | return array; 188 | }, 189 | 190 | getordinal = function(options){ 191 | var args = options.content.split(","); 192 | var date = args[1]; 193 | var month = args[2]; 194 | var ordinal = state.Calendar.now.ordinal; 195 | 196 | if(date == 'festival'){ 197 | date = 1; 198 | }else{ 199 | date = Number(args[1]); 200 | } 201 | 202 | switch(month) { 203 | case 'Hammer': 204 | ordinal = date; 205 | break; 206 | case 'Midwinter': 207 | ordinal = 31; 208 | break; 209 | case 'Alturiak': 210 | ordinal = 31+date; 211 | break; 212 | case 'Ches': 213 | ordinal = 61+date; 214 | break; 215 | case 'Tarsakhs': 216 | ordinal = 91+date; 217 | break; 218 | case 'Greengrass': 219 | ordinal = 122; 220 | break; 221 | case 'Mirtul': 222 | ordinal = 122+date; 223 | break; 224 | case 'Kythorn': 225 | ordinal = 152+date; 226 | break; 227 | case 'Flamerule': 228 | ordinal = 182+date; 229 | break; 230 | case 'Midsummer': 231 | ordinal = 213; 232 | break; 233 | case 'Eleasias': 234 | ordinal = 213+date; 235 | break; 236 | case 'Eleint': 237 | ordinal = 243+date; 238 | break; 239 | case 'Highharvestide': 240 | ordinal = 274; 241 | break; 242 | case 'Marpenoth': 243 | ordinal = 274+date; 244 | break; 245 | case 'Uktar': 246 | ordinal = 304+date; 247 | break; 248 | case 'Feast of the Moon': 249 | ordinal = 334+date; 250 | break; 251 | case 'Nightal': 252 | ordinal = 335+date; 253 | break; 254 | } 255 | state.Calendar.now.ordinal = ordinal; 256 | }, 257 | 258 | getsuffix = function(day) { 259 | 260 | var date = Number(day) 261 | var suffix 262 | 263 | if (date == 1 || date == 21 ){ 264 | suffix = 'st'; 265 | }else if (date == 2 || date == 22){ 266 | suffix = 'nd'; 267 | }else if (date == 3 || date == 23){ 268 | suffix = 'rd'; 269 | }else{ 270 | suffix = 'th'; 271 | } 272 | 273 | return suffix; 274 | }, 275 | 276 | getdown = function(days) { 277 | var down = Number(days) 278 | down = Math.floor(down/state.Calendar.now.div); 279 | return down; 280 | }, 281 | 282 | addday = function(add) { 283 | var ordinal = Number(add) 284 | state.Calendar.now.down = Number(state.Calendar.now.down)+ordinal 285 | ordinal = ordinal + Number(state.Calendar.now.ordinal); 286 | 287 | if(ordinal>365){ 288 | ordinal=ordinal-365; 289 | state.Calendar.now.year = Number(state.Calendar.now.year)+1; 290 | } 291 | 292 | state.Calendar.now.ordinal = ordinal; 293 | }, 294 | 295 | weather = function() { 296 | var roll; 297 | var temperature; 298 | var wind; 299 | var precipitation; 300 | var season; 301 | var ordinal = state.Calendar.now.ordinal; 302 | 303 | if(ordinal > 349 || ordinal <= 75){ 304 | season = 'Winter' 305 | }else if(ordinal > 75 && ordinal <= 166){ 306 | season = 'Spring' 307 | }else if(ordinal > 166 && ordinal <=257 ){ 308 | season = 'Summer' 309 | }else if(ordinal > 257 && ordinal <=349 ){ 310 | season = 'Fall' 311 | } 312 | 313 | roll = Math.floor(Math.random()*(20-1+1)+1); 314 | if(roll>=15 && roll<=17){ 315 | switch(season) { 316 | case 'Winter': 317 | temperature = 'It is a bitterly cold winter day. '; 318 | break; 319 | case 'Spring': 320 | temperature = 'It is a cold spring day. '; 321 | break; 322 | case 'Summer': 323 | temperature = 'It is a cool summer day. '; 324 | break; 325 | case 'Fall': 326 | temperature = 'It is a cold fall day. '; 327 | break; 328 | } 329 | }else if(roll>=18 && roll<=20){ 330 | switch(season) { 331 | case 'Winter': 332 | temperature = 'It is a warm winter day. '; 333 | break; 334 | case 'Spring': 335 | temperature = 'It is a hot spring day. '; 336 | break; 337 | case 'Summer': 338 | temperature = 'It is a blisteringly hot summer day. '; 339 | break; 340 | case 'Fall': 341 | temperature = 'It is a hot fall day. '; 342 | break; 343 | } 344 | }else{ 345 | switch(season) { 346 | case 'Winter': 347 | temperature = 'It is a cold winter day. '; 348 | break; 349 | case 'Spring': 350 | temperature = 'It is a mild spring day. '; 351 | break; 352 | case 'Summer': 353 | temperature = 'It is a hot summer day. '; 354 | break; 355 | case 'Fall': 356 | temperature = 'It is a mild fall day. '; 357 | break; 358 | } 359 | 360 | } 361 | 362 | roll = Math.floor(Math.random()*(20-1+1)+1); 363 | if(roll>=15 && roll<=17){ 364 | wind='There is a light breeze and '; 365 | }else if(roll>=18 && roll<=20){ 366 | wind='There is a howling wind and '; 367 | }else{ 368 | wind='The air is still and '; 369 | } 370 | 371 | roll = Math.floor(Math.random()*(20-1+1)+1); 372 | if(roll>=15 && roll<=17){ 373 | precipitation="Light rain or snow."; 374 | if(season=='Winter'){ 375 | precipitation = 'snow falls softly on the ground.'; 376 | }else{ 377 | precipitation = 'a light rain falls from the sky.'; 378 | } 379 | }else if(roll>=18 && roll<=20){ 380 | if(season=='Winter'){ 381 | precipitation = 'snow falls thick and fast from the sky.'; 382 | }else{ 383 | precipitation = 'a torrential rain begins to fall.'; 384 | } 385 | }else{ 386 | roll = Math.floor(Math.random()*(2-1+1)+1); 387 | if(roll=1){ 388 | precipitation = 'the sky is overcast.'; 389 | }else{ 390 | precipitation = 'the sky is clear.'; 391 | } 392 | } 393 | 394 | var forecast=temperature+wind+precipitation; 395 | state.Calendar.now.weather = forecast; 396 | }, 397 | 398 | checkInstall = function() { 399 | // Check if the Calendar property exists, creating it if it doesn't 400 | if( ! state.Calendar ) { 401 | setDefaults(); 402 | } 403 | }, 404 | 405 | registerEventHandlers = function() { 406 | on('chat:message', handleInput); 407 | }; 408 | 409 | return { 410 | CheckInstall: checkInstall, 411 | RegisterEventHandlers: registerEventHandlers 412 | }; 413 | 414 | }()); 415 | 416 | on("ready",function(){ 417 | 'use strict'; 418 | Calendar.CheckInstall(); 419 | Calendar.RegisterEventHandlers(); 420 | }); -------------------------------------------------------------------------------- /Faerun Calendar v2.1.js: -------------------------------------------------------------------------------- 1 | // Calendar and down day counter for Faerun 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | // API Commands: 5 | // !cal - for the GM displays the menu in the chat window, for a player displays date, weather and down days 6 | 7 | // Red Colour: #7E2D40 8 | 9 | var Calendar = Calendar || (function() { 10 | 'use strict'; 11 | 12 | var version = '0.2.1', 13 | 14 | setDefaults = function() { 15 | state.Calendar = { 16 | now: { 17 | ordinal: 1, 18 | year: 1486, 19 | down: 0, 20 | divider: 1, 21 | weather: "It is a cool but sunny day" 22 | }, 23 | }; 24 | }, 25 | 26 | handleInput = function(msg) { 27 | var args = msg.content.split(","); 28 | 29 | if (msg.type !== "api") { 30 | return; 31 | } 32 | 33 | if(playerIsGM(msg.playerid)){ 34 | switch(args[0]) { 35 | case '!cal': 36 | calmenu(); 37 | break; 38 | case '!setday': 39 | getordinal(msg); 40 | weather(); 41 | calmenu(); 42 | break; 43 | case '!setmonth': 44 | getordinal(msg); 45 | weather(); 46 | calmenu(); 47 | break; 48 | case '!setyear': 49 | state.Calendar.now.year=args[1]; 50 | calmenu(); 51 | break; 52 | case '!setordinal': 53 | state.Calendar.now.ordinal=args[1]; 54 | calmenu(); 55 | break; 56 | case '!setdown': 57 | var down = Number(args[1]); 58 | state.Calendar.now.down = down; 59 | getdown(down); 60 | calmenu(); 61 | break; 62 | case '!setdiv': 63 | state.Calendar.now.div=Number(args[1]); 64 | calmenu(); 65 | break; 66 | case '!addday': 67 | addday(args[1]); 68 | weather(); 69 | calmenu(); 70 | break; 71 | case '!weather': 72 | weather(); 73 | calmenu(); 74 | break; 75 | case '!playercal': 76 | showcal(msg); 77 | break; 78 | } 79 | }else if(args[0]=='!cal'){ 80 | showcal(msg); 81 | } 82 | }, 83 | 84 | calmenu = function() { 85 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 86 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 87 | var tablestyle = 'style="text-align:center;"'; 88 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 89 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 90 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 91 | var down = state.Calendar.now.down; 92 | down = getdown(down); 93 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 94 | var month = nowdate[0]; 95 | var day = nowdate[1]; 96 | 97 | sendChat('Calendar', '
' + //-- 98 | '
Calendar
' + //-- 99 | '
Menu
' + //-- 100 | '
' + //-- 101 | '' + //-- 102 | '' + //-- 103 | '' + //-- 104 | '' + //-- 105 | '' + //-- 106 | '' + //-- 107 | '' + //-- 108 | '
Day: ' + day + '
Month: ' + month + '
Year: ' + state.Calendar.now.year + '
Ordinal: ' + state.Calendar.now.ordinal + '
Down Days: ' + down + '
Down Day
Divider:
' + state.Calendar.now.div + '
' + //-- 109 | '
Weather: ' + state.Calendar.now.weather + //-- 110 | '

Advance the Date
' + //-- 111 | '
Roll Weather
' + //-- 112 | '
Show to Players
' + //-- 113 | '
' 114 | ); 115 | }, 116 | 117 | showcal = function(msg) { 118 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 119 | var month = nowdate[0]; 120 | var day = nowdate[1]; 121 | var down = state.Calendar.now.down; 122 | down = getdown(down); 123 | var suffix = getsuffix(day); 124 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 125 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 126 | var tablestyle = 'style="text-align:center;"'; 127 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 128 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 129 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 130 | 131 | sendChat(msg.who, '
' + //-- 132 | '
Calendar
' + //-- 133 | '
Player View
' + //-- 134 | '
' + //-- 135 | day + suffix + ' ' + month + ', ' + state.Calendar.now.year + //-- 136 | '
Players have ' + down + ' down days.' + //-- 137 | '

Today\'s weather:
' + state.Calendar.now.weather 138 | ); 139 | }, 140 | 141 | getdate = function(options){ 142 | var day = Number(options); 143 | var date; 144 | var month; 145 | 146 | if(day>0 && day<=30){ 147 | month="Hammer"; 148 | date=day; 149 | }else if(day==31){ 150 | month="Midwinter"; 151 | date='festival'; 152 | }else if(day>31 && day<=61){ 153 | month="Alturiak"; 154 | date=day-31; 155 | }else if(day>61 && day<=91){ 156 | month="Ches"; 157 | date=day-61; 158 | }else if(day>91 && day<=121){ 159 | month="Tarsakh"; 160 | date=day-91; 161 | }else if(day==122){ 162 | month="Greengrass"; 163 | date='festival'; 164 | }else if(day>122 && day<=152){ 165 | month="Mirtul"; 166 | date=day-122; 167 | }else if(day>152 && day<=182){ 168 | month="Kythorn"; 169 | date=day-152; 170 | }else if(day>182 && day<=212){ 171 | month="Flamerule"; 172 | date=day-182; 173 | }else if(day==213){ 174 | month="Midsummer"; 175 | date='festival'; 176 | }else if(day>213 && day<=243){ 177 | month="Eleasias" 178 | date=day-213; 179 | }else if(day>243 && day<=273){ 180 | month="Eleint"; 181 | date=day-243; 182 | }else if(day==274){ 183 | month="Highharvestide"; 184 | date='festival'; 185 | }else if(day>274 && day<=304){ 186 | month="Marpenoth"; 187 | date=day-274; 188 | }else if(day>304 && day<=334){ 189 | month="Uktar"; 190 | date=day-304; 191 | }else if(day==335){ 192 | month="Feast of the Moon"; 193 | date='festival'; 194 | }else if(day>335 && day<=365){ 195 | month="Nightal"; 196 | date=day-335; 197 | }else{ 198 | month="Hammer"; 199 | date='1'; 200 | } 201 | 202 | var array=month+','+String(date); 203 | return array; 204 | }, 205 | 206 | getordinal = function(options){ 207 | var args = options.content.split(","); 208 | var date = args[1]; 209 | var month = args[2]; 210 | var ordinal = state.Calendar.now.ordinal; 211 | 212 | if(date == 'festival'){ 213 | date = 1; 214 | }else{ 215 | date = Number(args[1]); 216 | } 217 | 218 | switch(month) { 219 | case 'Hammer': 220 | ordinal = date; 221 | break; 222 | case 'Midwinter': 223 | ordinal = 31; 224 | break; 225 | case 'Alturiak': 226 | ordinal = 31+date; 227 | break; 228 | case 'Ches': 229 | ordinal = 61+date; 230 | break; 231 | case 'Tarsakhs': 232 | ordinal = 91+date; 233 | break; 234 | case 'Greengrass': 235 | ordinal = 122; 236 | break; 237 | case 'Mirtul': 238 | ordinal = 122+date; 239 | break; 240 | case 'Kythorn': 241 | ordinal = 152+date; 242 | break; 243 | case 'Flamerule': 244 | ordinal = 182+date; 245 | break; 246 | case 'Midsummer': 247 | ordinal = 213; 248 | break; 249 | case 'Eleasias': 250 | ordinal = 213+date; 251 | break; 252 | case 'Eleint': 253 | ordinal = 243+date; 254 | break; 255 | case 'Highharvestide': 256 | ordinal = 274; 257 | break; 258 | case 'Marpenoth': 259 | ordinal = 274+date; 260 | break; 261 | case 'Uktar': 262 | ordinal = 304+date; 263 | break; 264 | case 'Feast of the Moon': 265 | ordinal = 334+date; 266 | break; 267 | case 'Nightal': 268 | ordinal = 335+date; 269 | break; 270 | } 271 | state.Calendar.now.ordinal = ordinal; 272 | }, 273 | 274 | getsuffix = function(day) { 275 | 276 | var date = Number(day) 277 | var suffix 278 | 279 | if (date == 1 || date == 21 ){ 280 | suffix = 'st'; 281 | }else if (date == 2 || date == 22){ 282 | suffix = 'nd'; 283 | }else if (date == 3 || date == 23){ 284 | suffix = 'rd'; 285 | }else{ 286 | suffix = 'th'; 287 | } 288 | 289 | return suffix; 290 | }, 291 | 292 | getdown = function(days) { 293 | var down = Number(days) 294 | down = Math.floor(down/state.Calendar.now.div); 295 | return down; 296 | }, 297 | 298 | addday = function(add) { 299 | var ordinal = Number(add) 300 | state.Calendar.now.down = Number(state.Calendar.now.down)+ordinal 301 | ordinal = ordinal + Number(state.Calendar.now.ordinal); 302 | 303 | if(ordinal>365){ 304 | ordinal=ordinal-365; 305 | state.Calendar.now.year = Number(state.Calendar.now.year)+1; 306 | } 307 | 308 | state.Calendar.now.ordinal = ordinal; 309 | }, 310 | 311 | weather = function() { 312 | var roll; 313 | var temperature; 314 | var wind; 315 | var precipitation; 316 | var season; 317 | var ordinal = state.Calendar.now.ordinal; 318 | 319 | if(ordinal > 349 || ordinal <= 75){ 320 | season = 'Winter' 321 | }else if(ordinal > 75 && ordinal <= 166){ 322 | season = 'Spring' 323 | }else if(ordinal > 166 && ordinal <=257 ){ 324 | season = 'Summer' 325 | }else if(ordinal > 257 && ordinal <=349 ){ 326 | season = 'Fall' 327 | } 328 | 329 | roll = Math.floor(Math.random()*(20-1+1)+1); 330 | if(roll>=15 && roll<=17){ 331 | switch(season) { 332 | case 'Winter': 333 | temperature = 'It is a bitterly cold winter day. '; 334 | break; 335 | case 'Spring': 336 | temperature = 'It is a cold spring day. '; 337 | break; 338 | case 'Summer': 339 | temperature = 'It is a cool summer day. '; 340 | break; 341 | case 'Fall': 342 | temperature = 'It is a cold fall day. '; 343 | break; 344 | } 345 | }else if(roll>=18 && roll<=20){ 346 | switch(season) { 347 | case 'Winter': 348 | temperature = 'It is a warm winter day. '; 349 | break; 350 | case 'Spring': 351 | temperature = 'It is a hot spring day. '; 352 | break; 353 | case 'Summer': 354 | temperature = 'It is a blisteringly hot summer day. '; 355 | break; 356 | case 'Fall': 357 | temperature = 'It is a hot fall day. '; 358 | break; 359 | } 360 | }else{ 361 | switch(season) { 362 | case 'Winter': 363 | temperature = 'It is a cold winter day. '; 364 | break; 365 | case 'Spring': 366 | temperature = 'It is a mild spring day. '; 367 | break; 368 | case 'Summer': 369 | temperature = 'It is a hot summer day. '; 370 | break; 371 | case 'Fall': 372 | temperature = 'It is a mild fall day. '; 373 | break; 374 | } 375 | 376 | } 377 | 378 | roll = Math.floor(Math.random()*(20-1+1)+1); 379 | if(roll>=15 && roll<=17){ 380 | wind='There is a light breeze and '; 381 | }else if(roll>=18 && roll<=20){ 382 | wind='There is a howling wind and '; 383 | }else{ 384 | wind='The air is still and '; 385 | } 386 | 387 | roll = Math.floor(Math.random()*(20-1+1)+1); 388 | if(roll>=15 && roll<=17){ 389 | precipitation="Light rain or snow."; 390 | if(season=='Winter'){ 391 | precipitation = 'snow falls softly on the ground.'; 392 | }else{ 393 | precipitation = 'a light rain falls from the sky.'; 394 | } 395 | }else if(roll>=18 && roll<=20){ 396 | if(season=='Winter'){ 397 | precipitation = 'snow falls thick and fast from the sky.'; 398 | }else{ 399 | precipitation = 'a torrential rain begins to fall.'; 400 | } 401 | }else{ 402 | roll = Math.floor(Math.random()*(2-1+1)+1); 403 | if(roll=1){ 404 | precipitation = 'the sky is overcast.'; 405 | }else{ 406 | precipitation = 'the sky is clear.'; 407 | } 408 | } 409 | 410 | var forecast=temperature+wind+precipitation; 411 | state.Calendar.now.weather = forecast; 412 | }, 413 | 414 | checkInstall = function() { 415 | // Check if the Calendar property exists, creating it if it doesn't 416 | if( ! state.Calendar ) { 417 | setDefaults(); 418 | } 419 | }, 420 | 421 | registerEventHandlers = function() { 422 | on('chat:message', handleInput); 423 | }; 424 | 425 | return { 426 | CheckInstall: checkInstall, 427 | RegisterEventHandlers: registerEventHandlers 428 | }; 429 | 430 | }()); 431 | 432 | on("ready",function(){ 433 | 'use strict'; 434 | Calendar.CheckInstall(); 435 | Calendar.RegisterEventHandlers(); 436 | }); -------------------------------------------------------------------------------- /Faerun Calendar v2.2: -------------------------------------------------------------------------------- 1 | // Calendar and down day counter for Faerun 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | // API Commands: 5 | // !cal - for the GM displays the menu in the chat window, for a player displays date, weather and down days 6 | 7 | // Red Colour: #7E2D40 8 | 9 | var Calendar = Calendar || (function() { 10 | 'use strict'; 11 | 12 | var version = '0.2.2', 13 | 14 | setDefaults = function() { 15 | state.Calendar = { 16 | now: { 17 | ordinal: 1, 18 | year: 1486, 19 | down: 0, 20 | divider: 1, 21 | weather: "It is a cool but sunny day" 22 | }, 23 | }; 24 | }, 25 | 26 | handleInput = function(msg) { 27 | var args = msg.content.split(","); 28 | 29 | if (msg.type !== "api") { 30 | return; 31 | } 32 | 33 | if(playerIsGM(msg.playerid)){ 34 | switch(args[0]) { 35 | case '!cal': 36 | calmenu(); 37 | break; 38 | case '!setday': 39 | getordinal(msg); 40 | weather(); 41 | calmenu(); 42 | break; 43 | case '!setmonth': 44 | getordinal(msg); 45 | weather(); 46 | calmenu(); 47 | break; 48 | case '!setyear': 49 | state.Calendar.now.year=args[1]; 50 | calmenu(); 51 | break; 52 | case '!setordinal': 53 | state.Calendar.now.ordinal=args[1]; 54 | calmenu(); 55 | break; 56 | case '!setdown': 57 | var down = Number(args[1]); 58 | state.Calendar.now.down = down; 59 | getdown(down); 60 | calmenu(); 61 | break; 62 | case '!setdiv': 63 | state.Calendar.now.div=Number(args[1]); 64 | calmenu(); 65 | break; 66 | case '!addday': 67 | addday(args[1]); 68 | weather(); 69 | calmenu(); 70 | break; 71 | case '!weather': 72 | weather(); 73 | calmenu(); 74 | break; 75 | case '!playercal': 76 | showcal(msg); 77 | break; 78 | } 79 | }else if(args[0]=='!cal'){ 80 | showcal(msg); 81 | } 82 | }, 83 | 84 | calmenu = function() { 85 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 86 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 87 | var tablestyle = 'style="text-align:center;"'; 88 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 89 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 90 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 91 | var down = state.Calendar.now.down; 92 | down = getdown(down); 93 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 94 | var month = nowdate[0]; 95 | var day = nowdate[1]; 96 | 97 | sendChat('Calendar', '
' + //-- 98 | '
Calendar
' + //-- 99 | '
Menu
' + //-- 100 | '
' + //-- 101 | '' + //-- 102 | '' + //-- 103 | '' + //-- 104 | '' + //-- 105 | '' + //-- 106 | '' + //-- 107 | '' + //-- 108 | '
Day: ' + day + '
Month: ' + month + '
Year: ' + state.Calendar.now.year + '
Ordinal: ' + state.Calendar.now.ordinal + '
Down Days: ' + down + '
Down Day
Divider:
' + state.Calendar.now.div + '
' + //-- 109 | '
Weather: ' + state.Calendar.now.weather + //-- 110 | '

Advance the Date
' + //-- 111 | '
Roll Weather
' + //-- 112 | '
Show to Players
' + //-- 113 | '
' 114 | ); 115 | }, 116 | 117 | showcal = function(msg) { 118 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 119 | var month = nowdate[0]; 120 | var day = nowdate[1]; 121 | var down = state.Calendar.now.down; 122 | down = getdown(down); 123 | var suffix = getsuffix(day); 124 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 125 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 126 | var tablestyle = 'style="text-align:center;"'; 127 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 128 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 129 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 130 | 131 | sendChat(msg.who, '
' + //-- 132 | '
Calendar
' + //-- 133 | '
Player View
' + //-- 134 | '
' + //-- 135 | day + suffix + ' ' + month + ', ' + state.Calendar.now.year + //-- 136 | '
Players have ' + down + ' down days.' + //-- 137 | '

Today\'s weather:
' + state.Calendar.now.weather 138 | ); 139 | }, 140 | 141 | getdate = function(options){ 142 | var day = Number(options); 143 | var date; 144 | var month; 145 | 146 | if(day>0 && day<=30){ 147 | month="Hammer"; 148 | date=day; 149 | }else if(day==31){ 150 | month="Midwinter"; 151 | date='festival'; 152 | }else if(day>31 && day<=61){ 153 | month="Alturiak"; 154 | date=day-31; 155 | }else if(day>61 && day<=91){ 156 | month="Ches"; 157 | date=day-61; 158 | }else if(day>91 && day<=121){ 159 | month="Tarsakh"; 160 | date=day-91; 161 | }else if(day==122){ 162 | month="Greengrass"; 163 | date='festival'; 164 | }else if(day>122 && day<=152){ 165 | month="Mirtul"; 166 | date=day-122; 167 | }else if(day>152 && day<=182){ 168 | month="Kythorn"; 169 | date=day-152; 170 | }else if(day>182 && day<=212){ 171 | month="Flamerule"; 172 | date=day-182; 173 | }else if(day==213){ 174 | month="Midsummer"; 175 | date='festival'; 176 | }else if(day>213 && day<=243){ 177 | month="Eleasias" 178 | date=day-213; 179 | }else if(day>243 && day<=273){ 180 | month="Eleint"; 181 | date=day-243; 182 | }else if(day==274){ 183 | month="Highharvestide"; 184 | date='festival'; 185 | }else if(day>274 && day<=304){ 186 | month="Marpenoth"; 187 | date=day-274; 188 | }else if(day>304 && day<=334){ 189 | month="Uktar"; 190 | date=day-304; 191 | }else if(day==335){ 192 | month="Feast of the Moon"; 193 | date='festival'; 194 | }else if(day>335 && day<=365){ 195 | month="Nightal"; 196 | date=day-335; 197 | }else{ 198 | month="Hammer"; 199 | date='1'; 200 | } 201 | 202 | var array=month+','+String(date); 203 | return array; 204 | }, 205 | 206 | getordinal = function(options){ 207 | var args = options.content.split(","); 208 | var date = args[1]; 209 | var month = args[2]; 210 | var ordinal = state.Calendar.now.ordinal; 211 | 212 | if(date == 'festival'){ 213 | date = 1; 214 | }else{ 215 | date = Number(args[1]); 216 | } 217 | 218 | switch(month) { 219 | case 'Hammer': 220 | ordinal = date; 221 | break; 222 | case 'Midwinter': 223 | ordinal = 31; 224 | break; 225 | case 'Alturiak': 226 | ordinal = 31+date; 227 | break; 228 | case 'Ches': 229 | ordinal = 61+date; 230 | break; 231 | case 'Tarsakh': 232 | ordinal = 91+date; 233 | break; 234 | case 'Greengrass': 235 | ordinal = 122; 236 | break; 237 | case 'Mirtul': 238 | ordinal = 122+date; 239 | break; 240 | case 'Kythorn': 241 | ordinal = 152+date; 242 | break; 243 | case 'Flamerule': 244 | ordinal = 182+date; 245 | break; 246 | case 'Midsummer': 247 | ordinal = 213; 248 | break; 249 | case 'Eleasias': 250 | ordinal = 213+date; 251 | break; 252 | case 'Eleint': 253 | ordinal = 243+date; 254 | break; 255 | case 'Highharvestide': 256 | ordinal = 274; 257 | break; 258 | case 'Marpenoth': 259 | ordinal = 274+date; 260 | break; 261 | case 'Uktar': 262 | ordinal = 304+date; 263 | break; 264 | case 'Feast of the Moon': 265 | ordinal = 334+date; 266 | break; 267 | case 'Nightal': 268 | ordinal = 335+date; 269 | break; 270 | } 271 | state.Calendar.now.ordinal = ordinal; 272 | }, 273 | 274 | getsuffix = function(day) { 275 | 276 | var date = Number(day) 277 | var suffix 278 | 279 | if (date == 1 || date == 21 ){ 280 | suffix = 'st'; 281 | }else if (date == 2 || date == 22){ 282 | suffix = 'nd'; 283 | }else if (date == 3 || date == 23){ 284 | suffix = 'rd'; 285 | }else{ 286 | suffix = 'th'; 287 | } 288 | 289 | return suffix; 290 | }, 291 | 292 | getdown = function(days) { 293 | var down = Number(days) 294 | down = Math.floor(down/state.Calendar.now.div); 295 | return down; 296 | }, 297 | 298 | addday = function(add) { 299 | var ordinal = Number(add) 300 | state.Calendar.now.down = Number(state.Calendar.now.down)+ordinal 301 | ordinal = ordinal + Number(state.Calendar.now.ordinal); 302 | 303 | if(ordinal>365){ 304 | ordinal=ordinal-365; 305 | state.Calendar.now.year = Number(state.Calendar.now.year)+1; 306 | } 307 | 308 | state.Calendar.now.ordinal = ordinal; 309 | }, 310 | 311 | weather = function() { 312 | var roll; 313 | var temperature; 314 | var wind; 315 | var precipitation; 316 | var season; 317 | var ordinal = state.Calendar.now.ordinal; 318 | 319 | if(ordinal > 349 || ordinal <= 75){ 320 | season = 'Winter' 321 | }else if(ordinal > 75 && ordinal <= 166){ 322 | season = 'Spring' 323 | }else if(ordinal > 166 && ordinal <=257 ){ 324 | season = 'Summer' 325 | }else if(ordinal > 257 && ordinal <=349 ){ 326 | season = 'Fall' 327 | } 328 | 329 | roll = Math.floor(Math.random()*(20-1+1)+1); 330 | if(roll>=15 && roll<=17){ 331 | switch(season) { 332 | case 'Winter': 333 | temperature = 'It is a bitterly cold winter day. '; 334 | break; 335 | case 'Spring': 336 | temperature = 'It is a cold spring day. '; 337 | break; 338 | case 'Summer': 339 | temperature = 'It is a cool summer day. '; 340 | break; 341 | case 'Fall': 342 | temperature = 'It is a cold fall day. '; 343 | break; 344 | } 345 | }else if(roll>=18 && roll<=20){ 346 | switch(season) { 347 | case 'Winter': 348 | temperature = 'It is a warm winter day. '; 349 | break; 350 | case 'Spring': 351 | temperature = 'It is a hot spring day. '; 352 | break; 353 | case 'Summer': 354 | temperature = 'It is a blisteringly hot summer day. '; 355 | break; 356 | case 'Fall': 357 | temperature = 'It is a hot fall day. '; 358 | break; 359 | } 360 | }else{ 361 | switch(season) { 362 | case 'Winter': 363 | temperature = 'It is a cold winter day. '; 364 | break; 365 | case 'Spring': 366 | temperature = 'It is a mild spring day. '; 367 | break; 368 | case 'Summer': 369 | temperature = 'It is a hot summer day. '; 370 | break; 371 | case 'Fall': 372 | temperature = 'It is a mild fall day. '; 373 | break; 374 | } 375 | 376 | } 377 | 378 | roll = Math.floor(Math.random()*(20-1+1)+1); 379 | if(roll>=15 && roll<=17){ 380 | wind='There is a light breeze and '; 381 | }else if(roll>=18 && roll<=20){ 382 | wind='There is a howling wind and '; 383 | }else{ 384 | wind='The air is still and '; 385 | } 386 | 387 | roll = Math.floor(Math.random()*(20-1+1)+1); 388 | if(roll>=15 && roll<=17){ 389 | precipitation="Light rain or snow."; 390 | if(season=='Winter'){ 391 | precipitation = 'snow falls softly on the ground.'; 392 | }else{ 393 | precipitation = 'a light rain falls from the sky.'; 394 | } 395 | }else if(roll>=18 && roll<=20){ 396 | if(season=='Winter'){ 397 | precipitation = 'snow falls thick and fast from the sky.'; 398 | }else{ 399 | precipitation = 'a torrential rain begins to fall.'; 400 | } 401 | }else{ 402 | roll = Math.floor(Math.random()*(2-1+1)+1); 403 | if(roll=1){ 404 | precipitation = 'the sky is overcast.'; 405 | }else{ 406 | precipitation = 'the sky is clear.'; 407 | } 408 | } 409 | 410 | var forecast=temperature+wind+precipitation; 411 | state.Calendar.now.weather = forecast; 412 | }, 413 | 414 | checkInstall = function() { 415 | // Check if the Calendar property exists, creating it if it doesn't 416 | if( ! state.Calendar ) { 417 | setDefaults(); 418 | } 419 | }, 420 | 421 | registerEventHandlers = function() { 422 | on('chat:message', handleInput); 423 | }; 424 | 425 | return { 426 | CheckInstall: checkInstall, 427 | RegisterEventHandlers: registerEventHandlers 428 | }; 429 | 430 | }()); 431 | 432 | on("ready",function(){ 433 | 'use strict'; 434 | Calendar.CheckInstall(); 435 | Calendar.RegisterEventHandlers(); 436 | }); 437 | -------------------------------------------------------------------------------- /Faerun Calendar v2.3: -------------------------------------------------------------------------------- 1 | // Calendar and down day counter for Faerun 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | // API Commands: 5 | // !cal - for the GM displays the menu in the chat window, for a player displays date, weather and down days 6 | 7 | // Red Colour: #7E2D40 8 | 9 | var Calendar = Calendar || (function() { 10 | 'use strict'; 11 | 12 | var version = '0.2.3', 13 | 14 | setDefaults = function() { 15 | state.Calendar = { 16 | now: { 17 | ordinal: 1, 18 | year: 1486, 19 | down: 0, 20 | divider: 1, 21 | weather: "It is a cool but sunny day" 22 | }, 23 | }; 24 | }, 25 | 26 | handleInput = function(msg) { 27 | var args = msg.content.split(","); 28 | 29 | if (msg.type !== "api") { 30 | return; 31 | } 32 | 33 | if(playerIsGM(msg.playerid)){ 34 | switch(args[0]) { 35 | case '!cal': 36 | calmenu(); 37 | break; 38 | case '!setday': 39 | getordinal(msg); 40 | weather(); 41 | calmenu(); 42 | break; 43 | case '!setmonth': 44 | getordinal(msg); 45 | weather(); 46 | calmenu(); 47 | break; 48 | case '!setyear': 49 | state.Calendar.now.year=args[1]; 50 | calmenu(); 51 | break; 52 | case '!setordinal': 53 | state.Calendar.now.ordinal=args[1]; 54 | calmenu(); 55 | break; 56 | case '!setdown': 57 | var down = Number(args[1]); 58 | state.Calendar.now.down = down; 59 | getdown(down); 60 | calmenu(); 61 | break; 62 | case '!setdiv': 63 | state.Calendar.now.div=Number(args[1]); 64 | calmenu(); 65 | break; 66 | case '!addday': 67 | addday(args[1]); 68 | weather(); 69 | calmenu(); 70 | break; 71 | case '!weather': 72 | weather(); 73 | calmenu(); 74 | break; 75 | case '!playercal': 76 | showcal(msg); 77 | break; 78 | } 79 | }else if(args[0]=='!cal'){ 80 | showcal(msg); 81 | } 82 | }, 83 | 84 | calmenu = function() { 85 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 86 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 87 | var tablestyle = 'style="text-align:center;"'; 88 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 89 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 90 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 91 | var down = state.Calendar.now.down; 92 | down = getdown(down); 93 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 94 | var month = nowdate[0]; 95 | var day = nowdate[1]; 96 | 97 | sendChat('Calendar', '/w gm
' + //-- 98 | '
Calendar
' + //-- 99 | '
Menu
' + //-- 100 | '
' + //-- 101 | '' + //-- 102 | '' + //-- 103 | '' + //-- 104 | '' + //-- 105 | '' + //-- 106 | '' + //-- 107 | '' + //-- 108 | '
Day: ' + day + '
Month: ' + month + '
Year: ' + state.Calendar.now.year + '
Ordinal: ' + state.Calendar.now.ordinal + '
Down Days: ' + down + '
Down Day
Divider:
' + state.Calendar.now.div + '
' + //-- 109 | '
Weather: ' + state.Calendar.now.weather + //-- 110 | '

Advance the Date
' + //-- 111 | '
Roll Weather
' + //-- 112 | '
Show to Players
' + //-- 113 | '
' 114 | ); 115 | }, 116 | 117 | showcal = function(msg) { 118 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 119 | var month = nowdate[0]; 120 | var day = nowdate[1]; 121 | var down = state.Calendar.now.down; 122 | down = getdown(down); 123 | var suffix = getsuffix(day); 124 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 125 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 126 | var tablestyle = 'style="text-align:center;"'; 127 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 128 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 129 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 130 | 131 | sendChat(msg.who, '
' + //-- 132 | '
Calendar
' + //-- 133 | '
Player View
' + //-- 134 | '
' + //-- 135 | day + suffix + ' ' + month + ', ' + state.Calendar.now.year + //-- 136 | '
Players have ' + down + ' down days.' + //-- 137 | '

Today\'s weather:
' + state.Calendar.now.weather 138 | ); 139 | }, 140 | 141 | getdate = function(options){ 142 | var day = Number(options); 143 | var date; 144 | var month; 145 | 146 | if(day>0 && day<=30){ 147 | month="Hammer"; 148 | date=day; 149 | }else if(day==31){ 150 | month="Midwinter"; 151 | date='festival'; 152 | }else if(day>31 && day<=61){ 153 | month="Alturiak"; 154 | date=day-31; 155 | }else if(day>61 && day<=91){ 156 | month="Ches"; 157 | date=day-61; 158 | }else if(day>91 && day<=121){ 159 | month="Tarsakh"; 160 | date=day-91; 161 | }else if(day==122){ 162 | month="Greengrass"; 163 | date='festival'; 164 | }else if(day>122 && day<=152){ 165 | month="Mirtul"; 166 | date=day-122; 167 | }else if(day>152 && day<=182){ 168 | month="Kythorn"; 169 | date=day-152; 170 | }else if(day>182 && day<=212){ 171 | month="Flamerule"; 172 | date=day-182; 173 | }else if(day==213){ 174 | month="Midsummer"; 175 | date='festival'; 176 | }else if(day>213 && day<=243){ 177 | month="Eleasias" 178 | date=day-213; 179 | }else if(day>243 && day<=273){ 180 | month="Eleint"; 181 | date=day-243; 182 | }else if(day==274){ 183 | month="Highharvestide"; 184 | date='festival'; 185 | }else if(day>274 && day<=304){ 186 | month="Marpenoth"; 187 | date=day-274; 188 | }else if(day>304 && day<=334){ 189 | month="Uktar"; 190 | date=day-304; 191 | }else if(day==335){ 192 | month="Feast of the Moon"; 193 | date='festival'; 194 | }else if(day>335 && day<=365){ 195 | month="Nightal"; 196 | date=day-335; 197 | }else{ 198 | month="Hammer"; 199 | date='1'; 200 | } 201 | 202 | var array=month+','+String(date); 203 | return array; 204 | }, 205 | 206 | getordinal = function(options){ 207 | var args = options.content.split(","); 208 | var date = args[1]; 209 | var month = args[2]; 210 | var ordinal = state.Calendar.now.ordinal; 211 | 212 | if(date == 'festival'){ 213 | date = 1; 214 | }else{ 215 | date = Number(args[1]); 216 | } 217 | 218 | switch(month) { 219 | case 'Hammer': 220 | ordinal = date; 221 | break; 222 | case 'Midwinter': 223 | ordinal = 31; 224 | break; 225 | case 'Alturiak': 226 | ordinal = 31+date; 227 | break; 228 | case 'Ches': 229 | ordinal = 61+date; 230 | break; 231 | case 'Tarsakh': 232 | ordinal = 91+date; 233 | break; 234 | case 'Greengrass': 235 | ordinal = 122; 236 | break; 237 | case 'Mirtul': 238 | ordinal = 122+date; 239 | break; 240 | case 'Kythorn': 241 | ordinal = 152+date; 242 | break; 243 | case 'Flamerule': 244 | ordinal = 182+date; 245 | break; 246 | case 'Midsummer': 247 | ordinal = 213; 248 | break; 249 | case 'Eleasias': 250 | ordinal = 213+date; 251 | break; 252 | case 'Eleint': 253 | ordinal = 243+date; 254 | break; 255 | case 'Highharvestide': 256 | ordinal = 274; 257 | break; 258 | case 'Marpenoth': 259 | ordinal = 274+date; 260 | break; 261 | case 'Uktar': 262 | ordinal = 304+date; 263 | break; 264 | case 'Feast of the Moon': 265 | ordinal = 334+date; 266 | break; 267 | case 'Nightal': 268 | ordinal = 335+date; 269 | break; 270 | } 271 | state.Calendar.now.ordinal = ordinal; 272 | }, 273 | 274 | getsuffix = function(day) { 275 | 276 | var date = Number(day) 277 | var suffix 278 | 279 | if (date == 1 || date == 21 ){ 280 | suffix = 'st'; 281 | }else if (date == 2 || date == 22){ 282 | suffix = 'nd'; 283 | }else if (date == 3 || date == 23){ 284 | suffix = 'rd'; 285 | }else{ 286 | suffix = 'th'; 287 | } 288 | 289 | return suffix; 290 | }, 291 | 292 | getdown = function(days) { 293 | var down = Number(days) 294 | down = Math.floor(down/state.Calendar.now.div); 295 | return down; 296 | }, 297 | 298 | addday = function(add) { 299 | var ordinal = Number(add) 300 | state.Calendar.now.down = Number(state.Calendar.now.down)+ordinal 301 | ordinal = ordinal + Number(state.Calendar.now.ordinal); 302 | 303 | if(ordinal>365){ 304 | ordinal=ordinal-365; 305 | state.Calendar.now.year = Number(state.Calendar.now.year)+1; 306 | } 307 | 308 | state.Calendar.now.ordinal = ordinal; 309 | }, 310 | 311 | weather = function() { 312 | var roll; 313 | var temperature; 314 | var wind; 315 | var precipitation; 316 | var season; 317 | var ordinal = state.Calendar.now.ordinal; 318 | 319 | if(ordinal > 349 || ordinal <= 75){ 320 | season = 'Winter' 321 | }else if(ordinal > 75 && ordinal <= 166){ 322 | season = 'Spring' 323 | }else if(ordinal > 166 && ordinal <=257 ){ 324 | season = 'Summer' 325 | }else if(ordinal > 257 && ordinal <=349 ){ 326 | season = 'Fall' 327 | } 328 | 329 | roll = Math.floor(Math.random()*(20-1+1)+1); 330 | if(roll>=15 && roll<=17){ 331 | switch(season) { 332 | case 'Winter': 333 | temperature = 'It is a bitterly cold winter day. '; 334 | break; 335 | case 'Spring': 336 | temperature = 'It is a cold spring day. '; 337 | break; 338 | case 'Summer': 339 | temperature = 'It is a cool summer day. '; 340 | break; 341 | case 'Fall': 342 | temperature = 'It is a cold fall day. '; 343 | break; 344 | } 345 | }else if(roll>=18 && roll<=20){ 346 | switch(season) { 347 | case 'Winter': 348 | temperature = 'It is a warm winter day. '; 349 | break; 350 | case 'Spring': 351 | temperature = 'It is a hot spring day. '; 352 | break; 353 | case 'Summer': 354 | temperature = 'It is a blisteringly hot summer day. '; 355 | break; 356 | case 'Fall': 357 | temperature = 'It is a hot fall day. '; 358 | break; 359 | } 360 | }else{ 361 | switch(season) { 362 | case 'Winter': 363 | temperature = 'It is a cold winter day. '; 364 | break; 365 | case 'Spring': 366 | temperature = 'It is a mild spring day. '; 367 | break; 368 | case 'Summer': 369 | temperature = 'It is a hot summer day. '; 370 | break; 371 | case 'Fall': 372 | temperature = 'It is a mild fall day. '; 373 | break; 374 | } 375 | 376 | } 377 | 378 | roll = Math.floor(Math.random()*(20-1+1)+1); 379 | if(roll>=15 && roll<=17){ 380 | wind='There is a light breeze and '; 381 | }else if(roll>=18 && roll<=20){ 382 | wind='There is a howling wind and '; 383 | }else{ 384 | wind='The air is still and '; 385 | } 386 | 387 | roll = Math.floor(Math.random()*(20-1+1)+1); 388 | if(roll>=15 && roll<=17){ 389 | precipitation="Light rain or snow."; 390 | if(season=='Winter'){ 391 | precipitation = 'snow falls softly on the ground.'; 392 | }else{ 393 | precipitation = 'a light rain falls from the sky.'; 394 | } 395 | }else if(roll>=18 && roll<=20){ 396 | if(season=='Winter'){ 397 | precipitation = 'snow falls thick and fast from the sky.'; 398 | }else{ 399 | precipitation = 'a torrential rain begins to fall.'; 400 | } 401 | }else{ 402 | roll = Math.floor(Math.random()*(2-1+1)+1); 403 | if(roll=1){ 404 | precipitation = 'the sky is overcast.'; 405 | }else{ 406 | precipitation = 'the sky is clear.'; 407 | } 408 | } 409 | 410 | var forecast=temperature+wind+precipitation; 411 | state.Calendar.now.weather = forecast; 412 | }, 413 | 414 | checkInstall = function() { 415 | // Check if the Calendar property exists, creating it if it doesn't 416 | if( ! state.Calendar ) { 417 | setDefaults(); 418 | } 419 | }, 420 | 421 | registerEventHandlers = function() { 422 | on('chat:message', handleInput); 423 | }; 424 | 425 | return { 426 | CheckInstall: checkInstall, 427 | RegisterEventHandlers: registerEventHandlers 428 | }; 429 | 430 | }()); 431 | 432 | on("ready",function(){ 433 | 'use strict'; 434 | Calendar.CheckInstall(); 435 | Calendar.RegisterEventHandlers(); 436 | }); 437 | -------------------------------------------------------------------------------- /Faerun Calendar v2.4: -------------------------------------------------------------------------------- 1 | // Calendar and down day counter for Faerun 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | // API Commands: 5 | // !cal - for the GM displays the menu in the chat window, for a player displays date, weather, moon and down days 6 | 7 | // Red Colour: #7E2D40 8 | 9 | var Calendar = Calendar || (function() { 10 | 'use strict'; 11 | 12 | var version = '0.2.4', 13 | 14 | setDefaults = function() { 15 | state.Calendar = { 16 | now: { 17 | ordinal: 1, 18 | year: 1486, 19 | down: 0, 20 | divider: 1, 21 | weather: "It is a cool but sunny day" 22 | }, 23 | }; 24 | }, 25 | 26 | handleInput = function(msg) { 27 | var args = msg.content.split(","); 28 | 29 | if (msg.type !== "api") { 30 | return; 31 | } 32 | 33 | if(playerIsGM(msg.playerid)){ 34 | switch(args[0]) { 35 | case '!cal': 36 | calmenu(); 37 | break; 38 | case '!setday': 39 | getordinal(msg); 40 | weather(); 41 | calmenu(); 42 | break; 43 | case '!setmonth': 44 | getordinal(msg); 45 | weather(); 46 | calmenu(); 47 | break; 48 | case '!setyear': 49 | state.Calendar.now.year=args[1]; 50 | calmenu(); 51 | break; 52 | case '!setordinal': 53 | state.Calendar.now.ordinal=args[1]; 54 | calmenu(); 55 | break; 56 | case '!setdown': 57 | var down = Number(args[1]); 58 | state.Calendar.now.down = down; 59 | getdown(down); 60 | calmenu(); 61 | break; 62 | case '!setdiv': 63 | state.Calendar.now.div=Number(args[1]); 64 | calmenu(); 65 | break; 66 | case '!addday': 67 | addday(args[1]); 68 | weather(); 69 | calmenu(); 70 | break; 71 | case '!weather': 72 | weather(); 73 | calmenu(); 74 | break; 75 | case '!playercal': 76 | showcal(msg); 77 | break; 78 | } 79 | }else if(args[0]=='!cal'){ 80 | showcal(msg); 81 | } 82 | }, 83 | 84 | calmenu = function() { 85 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 86 | var astyle1 = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 100px;'; 87 | var astyle2 = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 150px;'; 88 | var tablestyle = 'style="text-align:center;"'; 89 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 90 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 91 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 92 | var down = state.Calendar.now.down; 93 | down = getdown(down); 94 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 95 | var month = nowdate[0]; 96 | var day = nowdate[1]; 97 | var moon = getmoon(); 98 | 99 | sendChat('Calendar', '/w gm
' + //-- 100 | '
Calendar
' + //-- 101 | '
Menu
' + //-- 102 | '
' + //-- 103 | '' + //-- 104 | '' + //-- 105 | '' + //-- 106 | '' + //-- 107 | '' + //-- 108 | '' + //-- 109 | '' + //-- 110 | '
Day: ' + day + '
Month: ' + month + '
Year: ' + state.Calendar.now.year + '
Ordinal: ' + state.Calendar.now.ordinal + '
Down Days: ' + down + '
Down Day
Divider:
' + state.Calendar.now.div + '
' + //-- 111 | '
Weather: ' + state.Calendar.now.weather + //-- 112 | '

Moon: ' + moon + //-- 113 | '

' + //-- 114 | '' + //-- 115 | '' + //-- 116 | '
' 117 | ); 118 | }, 119 | 120 | showcal = function(msg) { 121 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 122 | var month = nowdate[0]; 123 | var day = nowdate[1]; 124 | var down = state.Calendar.now.down; 125 | down = getdown(down); 126 | var suffix = getsuffix(day); 127 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 128 | var tablestyle = 'style="text-align:center;"'; 129 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 130 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 131 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 132 | var moon = getmoon(); 133 | var downstr; 134 | 135 | if(down!=0){ 136 | downstr = '
Players have ' + down + ' down days.'; 137 | }else{ 138 | downstr = ''; 139 | } 140 | 141 | 142 | sendChat(msg.who, '
' + //-- 143 | '
Calendar
' + //-- 144 | '
Player View
' + //-- 145 | '
' + //-- 146 | day + suffix + ' ' + month + ', ' + state.Calendar.now.year + //-- 147 | downstr + //-- 148 | '

Today\'s weather:
' + state.Calendar.now.weather + //-- 149 | '

Moon: ' + moon 150 | ); 151 | }, 152 | 153 | getdate = function(options){ 154 | var day = Number(options); 155 | var date; 156 | var month; 157 | 158 | if(day>0 && day<=30){ 159 | month="Hammer"; 160 | date=day; 161 | }else if(day==31){ 162 | month="Midwinter"; 163 | date='festival'; 164 | }else if(day>31 && day<=61){ 165 | month="Alturiak"; 166 | date=day-31; 167 | }else if(day>61 && day<=91){ 168 | month="Ches"; 169 | date=day-61; 170 | }else if(day>91 && day<=121){ 171 | month="Tarsakh"; 172 | date=day-91; 173 | }else if(day==122){ 174 | month="Greengrass"; 175 | date='festival'; 176 | }else if(day>122 && day<=152){ 177 | month="Mirtul"; 178 | date=day-122; 179 | }else if(day>152 && day<=182){ 180 | month="Kythorn"; 181 | date=day-152; 182 | }else if(day>182 && day<=212){ 183 | month="Flamerule"; 184 | date=day-182; 185 | }else if(day==213){ 186 | month="Midsummer"; 187 | date='festival'; 188 | }else if(day>213 && day<=243){ 189 | month="Eleasias" 190 | date=day-213; 191 | }else if(day>243 && day<=273){ 192 | month="Eleint"; 193 | date=day-243; 194 | }else if(day==274){ 195 | month="Highharvestide"; 196 | date='festival'; 197 | }else if(day>274 && day<=304){ 198 | month="Marpenoth"; 199 | date=day-274; 200 | }else if(day>304 && day<=334){ 201 | month="Uktar"; 202 | date=day-304; 203 | }else if(day==335){ 204 | month="Feast of the Moon"; 205 | date='festival'; 206 | }else if(day>335 && day<=365){ 207 | month="Nightal"; 208 | date=day-335; 209 | }else{ 210 | month="Hammer"; 211 | date='1'; 212 | } 213 | 214 | var array=month+','+String(date); 215 | return array; 216 | }, 217 | 218 | getordinal = function(options){ 219 | var args = options.content.split(","); 220 | var date = args[1]; 221 | var month = args[2]; 222 | var ordinal = state.Calendar.now.ordinal; 223 | 224 | if(date == 'festival'){ 225 | date = 1; 226 | }else{ 227 | date = Number(args[1]); 228 | } 229 | 230 | switch(month) { 231 | case 'Hammer': 232 | ordinal = date; 233 | break; 234 | case 'Midwinter': 235 | ordinal = 31; 236 | break; 237 | case 'Alturiak': 238 | ordinal = 31+date; 239 | break; 240 | case 'Ches': 241 | ordinal = 61+date; 242 | break; 243 | case 'Tarsakh': 244 | ordinal = 91+date; 245 | break; 246 | case 'Greengrass': 247 | ordinal = 122; 248 | break; 249 | case 'Mirtul': 250 | ordinal = 122+date; 251 | break; 252 | case 'Kythorn': 253 | ordinal = 152+date; 254 | break; 255 | case 'Flamerule': 256 | ordinal = 182+date; 257 | break; 258 | case 'Midsummer': 259 | ordinal = 213; 260 | break; 261 | case 'Eleasias': 262 | ordinal = 213+date; 263 | break; 264 | case 'Eleint': 265 | ordinal = 243+date; 266 | break; 267 | case 'Highharvestide': 268 | ordinal = 274; 269 | break; 270 | case 'Marpenoth': 271 | ordinal = 274+date; 272 | break; 273 | case 'Uktar': 274 | ordinal = 304+date; 275 | break; 276 | case 'Feast of the Moon': 277 | ordinal = 334+date; 278 | break; 279 | case 'Nightal': 280 | ordinal = 335+date; 281 | break; 282 | } 283 | state.Calendar.now.ordinal = ordinal; 284 | }, 285 | 286 | getsuffix = function(day) { 287 | 288 | var date = Number(day) 289 | var suffix 290 | 291 | if (date == 1 || date == 21 ){ 292 | suffix = 'st'; 293 | }else if (date == 2 || date == 22){ 294 | suffix = 'nd'; 295 | }else if (date == 3 || date == 23){ 296 | suffix = 'rd'; 297 | }else{ 298 | suffix = 'th'; 299 | } 300 | 301 | return suffix; 302 | }, 303 | 304 | getdown = function(days) { 305 | var down = Number(days); 306 | var div = state.Calendar.now.div; 307 | 308 | if(div!=0){ 309 | down = down/div; 310 | } 311 | 312 | return down; 313 | }, 314 | 315 | addday = function(add) { 316 | var ordinal = Number(add); 317 | var div = state.Calendar.now.div; 318 | 319 | if(div!=0){ 320 | state.Calendar.now.down = Number(state.Calendar.now.down)+ordinal; 321 | } 322 | 323 | 324 | ordinal = ordinal + Number(state.Calendar.now.ordinal); 325 | 326 | if(ordinal>365){ 327 | ordinal=ordinal-365; 328 | state.Calendar.now.year = Number(state.Calendar.now.year)+1; 329 | } 330 | 331 | state.Calendar.now.ordinal = ordinal; 332 | }, 333 | 334 | weather = function() { 335 | var roll; 336 | var temperature; 337 | var wind; 338 | var precipitation; 339 | var season; 340 | var ordinal = state.Calendar.now.ordinal; 341 | 342 | if(ordinal > 349 || ordinal <= 75){ 343 | season = 'Winter' 344 | }else if(ordinal > 75 && ordinal <= 166){ 345 | season = 'Spring' 346 | }else if(ordinal > 166 && ordinal <=257 ){ 347 | season = 'Summer' 348 | }else if(ordinal > 257 && ordinal <=349 ){ 349 | season = 'Fall' 350 | } 351 | 352 | roll = Math.floor(Math.random()*(20-1+1)+1); 353 | if(roll>=15 && roll<=17){ 354 | switch(season) { 355 | case 'Winter': 356 | temperature = 'It is a bitterly cold winter day. '; 357 | break; 358 | case 'Spring': 359 | temperature = 'It is a cold spring day. '; 360 | break; 361 | case 'Summer': 362 | temperature = 'It is a cool summer day. '; 363 | break; 364 | case 'Fall': 365 | temperature = 'It is a cold fall day. '; 366 | break; 367 | } 368 | }else if(roll>=18 && roll<=20){ 369 | switch(season) { 370 | case 'Winter': 371 | temperature = 'It is a warm winter day. '; 372 | break; 373 | case 'Spring': 374 | temperature = 'It is a hot spring day. '; 375 | break; 376 | case 'Summer': 377 | temperature = 'It is a blisteringly hot summer day. '; 378 | break; 379 | case 'Fall': 380 | temperature = 'It is a hot fall day. '; 381 | break; 382 | } 383 | }else{ 384 | switch(season) { 385 | case 'Winter': 386 | temperature = 'It is a cold winter day. '; 387 | break; 388 | case 'Spring': 389 | temperature = 'It is a mild spring day. '; 390 | break; 391 | case 'Summer': 392 | temperature = 'It is a hot summer day. '; 393 | break; 394 | case 'Fall': 395 | temperature = 'It is a mild fall day. '; 396 | break; 397 | } 398 | 399 | } 400 | 401 | roll = Math.floor(Math.random()*(20-1+1)+1); 402 | if(roll>=15 && roll<=17){ 403 | wind='There is a light breeze and '; 404 | }else if(roll>=18 && roll<=20){ 405 | wind='There is a howling wind and '; 406 | }else{ 407 | wind='The air is still and '; 408 | } 409 | 410 | roll = Math.floor(Math.random()*(20-1+1)+1); 411 | if(roll>=15 && roll<=17){ 412 | precipitation="Light rain or snow."; 413 | if(season=='Winter'){ 414 | precipitation = 'snow falls softly on the ground.'; 415 | }else{ 416 | precipitation = 'a light rain falls from the sky.'; 417 | } 418 | }else if(roll>=18 && roll<=20){ 419 | if(season=='Winter'){ 420 | precipitation = 'snow falls thick and fast from the sky.'; 421 | }else{ 422 | precipitation = 'a torrential rain begins to fall.'; 423 | } 424 | }else{ 425 | roll = Math.floor(Math.random()*(2-1+1)+1); 426 | if(roll=1){ 427 | precipitation = 'the sky is overcast.'; 428 | }else{ 429 | precipitation = 'the sky is clear.'; 430 | } 431 | } 432 | 433 | var forecast=temperature+wind+precipitation; 434 | state.Calendar.now.weather = forecast; 435 | }, 436 | 437 | getmoon = function() { 438 | var ordinal = state.Calendar.now.ordinal; 439 | var moonNo; 440 | var moon; 441 | 442 | moonNo = Math.ceil(ordinal/3)-Math.floor(Math.ceil(ordinal/3)/8)*8; 443 | 444 | switch(moonNo) { 445 | case 1: 446 | moon = 'First Quarter'; 447 | break; 448 | case 2: 449 | moon = 'Waxing Cresent'; 450 | break; 451 | case 3: 452 | moon = 'New'; 453 | break; 454 | case 4: 455 | moon = 'Waning Cresent'; 456 | break; 457 | case 5: 458 | moon = 'Third Quarter'; 459 | break; 460 | case 6: 461 | moon = 'Waning Gibbous'; 462 | break; 463 | case 7: 464 | moon = 'Full'; 465 | break; 466 | case 0: 467 | moon = 'Waxing Gibbous'; 468 | break; 469 | } 470 | 471 | return moon; 472 | }, 473 | 474 | checkInstall = function() { 475 | // Check if the Calendar property exists, creating it if it doesn't 476 | if( ! state.Calendar ) { 477 | setDefaults(); 478 | } 479 | }, 480 | 481 | registerEventHandlers = function() { 482 | on('chat:message', handleInput); 483 | }; 484 | 485 | return { 486 | CheckInstall: checkInstall, 487 | RegisterEventHandlers: registerEventHandlers 488 | }; 489 | 490 | }()); 491 | 492 | on("ready",function(){ 493 | 'use strict'; 494 | Calendar.CheckInstall(); 495 | Calendar.RegisterEventHandlers(); 496 | }); 497 | -------------------------------------------------------------------------------- /Greyhawk Calendar v2.0.js: -------------------------------------------------------------------------------- 1 | // Calendar and down day counter for Greyhawk 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | // Greyhawk and moon additions by Brusana (https://app.roll20.net/users/273644/brusana) 4 | 5 | // API Commands: 6 | // !cal - for the GM displays the menu in the chat window, for a player displays date, weather and down days 7 | 8 | // Red Colour: #7E2D40 9 | 10 | var Calendar = Calendar || (function() { 11 | 'use strict'; 12 | 13 | var version = '2.0', 14 | 15 | setDefaults = function() { 16 | state.Calendar = { 17 | now: { 18 | ordinal: 1, 19 | year: 595, 20 | down: 0, 21 | divider: 1, 22 | weather: "It is a cool but sunny day" 23 | }, 24 | }; 25 | }, 26 | 27 | handleInput = function(msg) { 28 | var args = msg.content.split(","); 29 | 30 | if (msg.type !== "api") { 31 | return; 32 | } 33 | 34 | if(playerIsGM(msg.playerid)){ 35 | switch(args[0]) { 36 | case '!cal': 37 | calmenu(); 38 | break; 39 | case '!setday': 40 | getordinal(msg); 41 | weather(); 42 | getmoons(); 43 | calmenu(); 44 | break; 45 | case '!setmonth': 46 | getordinal(msg); 47 | weather(); 48 | getmoons(); 49 | calmenu(); 50 | break; 51 | case '!setyear': 52 | state.Calendar.now.year=args[1]; 53 | calmenu(); 54 | break; 55 | case '!setordinal': 56 | state.Calendar.now.ordinal=args[1]; 57 | getmoons(); 58 | calmenu(); 59 | break; 60 | case '!setdown': 61 | var down = Number(args[1]); 62 | state.Calendar.now.down = down; 63 | getdown(down); 64 | calmenu(); 65 | break; 66 | case '!setdiv': 67 | state.Calendar.now.div=Number(args[1]); 68 | calmenu(); 69 | break; 70 | case '!addday': 71 | addday(args[1]); 72 | weather(); 73 | getmoons(); 74 | calmenu(); 75 | break; 76 | case '!weather': 77 | state.Calendar.now.weather=args[1]; 78 | getmoons(); 79 | calmenu(); 80 | break; 81 | case '!playercal': 82 | showcal(msg); 83 | break; 84 | } 85 | }else if(args[0]=='!cal'){ 86 | showcal(msg); 87 | } 88 | }, 89 | 90 | calmenu = function() { 91 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 92 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 93 | var tablestyle = 'style="text-align:center;"'; 94 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 95 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 96 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 97 | var down = state.Calendar.now.down; 98 | down = getdown(down); 99 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 100 | var month = nowdate[0]; 101 | var day = nowdate[1]; 102 | 103 | sendChat('Calendar', '/w gm
' + //-- 104 | '
Calendar
' + //-- 105 | '
Menu
' + //-- 106 | '
' + //-- 107 | '' + //-- 108 | '' + //-- 109 | '' + //-- 110 | '' + //-- 111 | '' + //-- 112 | '' + //-- 113 | // '' + //-- 114 | // '' + //-- 115 | '
Day: ' + day + '
Month: ' + month + '
Year: ' + state.Calendar.now.year +' CY
Ordinal: ' + state.Calendar.now.ordinal + '
Weather: Set Weather
Down Days: ' + down + '
Down Day
Divider:
' + state.Calendar.now.div + '
' + //-- 116 | '
Luna ' + state.Calendar.now.luna + //-- 117 | '
Celene ' + state.Calendar.now.celene + //-- 118 | '

Weather: ' + state.Calendar.now.weather + //-- 119 | '

' + //-- 120 | // '' + //-- 121 | '' + //-- 122 | '
' 123 | ); 124 | }, 125 | 126 | showcal = function(msg) { 127 | var nowdate = getdate(state.Calendar.now.ordinal).split(','); 128 | var month = nowdate[0]; 129 | var day = nowdate[1]; 130 | var down = state.Calendar.now.down; 131 | down = getdown(down); 132 | var suffix = getsuffix(day); 133 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 134 | var astyle = 'style="text-align:center; border: 1px solid black; margin: 1px; background-color: #7E2D40; border-radius: 4px; box-shadow: 1px 1px 1px #707070;'; 135 | var tablestyle = 'style="text-align:center;"'; 136 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 137 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 138 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 139 | 140 | sendChat(msg.who, '
' + //-- 141 | '
Calendar
' + //-- 142 | '
Player View
' + //-- 143 | '
' + //-- 144 | day + suffix + ' day of ' + month + ', ' + state.Calendar.now.year+' CY' + //-- 145 | '

' + //-- 146 | 'Luna ' + state.Calendar.now.luna + //-- 147 | '
' + //-- 148 | 'Celene ' + state.Calendar.now.celene + //-- 149 | // '
Players have ' + down + ' down days.' + //-- 150 | '

Today\'s weather:
' + state.Calendar.now.weather //-- 151 | ); 152 | }, 153 | 154 | getdate = function(options){ 155 | var day = Number(options); 156 | var date; 157 | var month; 158 | 159 | if(day>0 && day<=7){ 160 | month="Needfest"; 161 | date=day; 162 | }else if(day>7 && day<=35){ 163 | month="Fire Seek"; 164 | date=day-7; 165 | }else if(day>35 && day<=63){ 166 | month="Readying"; 167 | date=day-35; 168 | }else if(day>63 && day<=91){ 169 | month="Coldeven"; 170 | date=day-63; 171 | }else if(day>91 && day<=98){ 172 | month="Growfest"; 173 | date=day-91; 174 | }else if(day>98 && day<=126){ 175 | month="Planting"; 176 | date=day-98; 177 | }else if(day>126 && day<=154){ 178 | month="Flocktime"; 179 | date=day-126; 180 | }else if(day>154 && day<=182){ 181 | month="Wealsun"; 182 | date=day-154; 183 | }else if(day>182 && day<=189){ 184 | month="Richfest"; 185 | date=day-182; 186 | }else if(day>189 && day<=217){ 187 | month="Reaping"; 188 | date=day-189; 189 | }else if(day>217 && day<=245){ 190 | month="Goodmonth" 191 | date=day-217; 192 | }else if(day>245 && day<=273){ 193 | month="Harvester"; 194 | date=day-245; 195 | }else if(day>273 && day<=280){ 196 | month="Brewfest"; 197 | date=day-273; 198 | }else if(day>280 && day<=308){ 199 | month="Patchwall"; 200 | date=day-280; 201 | }else if(day>308 && day<=336){ 202 | month="Readyreat"; 203 | date=day-308; 204 | }else if(day>336 && day<=364){ 205 | month="Sunsebb"; 206 | date=day-336; 207 | }else{ 208 | month="Needfest"; 209 | date='1'; 210 | } 211 | 212 | var array=month+','+String(date); 213 | return array; 214 | }, 215 | 216 | getordinal = function(options){ 217 | var args = options.content.split(","); 218 | var date = args[1]; 219 | var month = args[2]; 220 | var ordinal = state.Calendar.now.ordinal; 221 | 222 | if(date == 'festival'){ 223 | date = 1; 224 | }else{ 225 | date = Number(args[1]); 226 | } 227 | 228 | switch(month) { 229 | case 'Needfest': 230 | ordinal = date; 231 | break; 232 | case 'Fire Seek': 233 | ordinal = 7+date; 234 | break; 235 | case 'Readying': 236 | ordinal = 35+date; 237 | break; 238 | case 'Coldeven': 239 | ordinal = 63+date; 240 | break; 241 | case 'Growfest': 242 | ordinal = 91+date; 243 | break; 244 | case 'Planting': 245 | ordinal = 98+date; 246 | break; 247 | case 'Flocktime': 248 | ordinal = 126+date; 249 | break; 250 | case 'Wealsun': 251 | ordinal = 154+date; 252 | break; 253 | case 'Richfest': 254 | ordinal = 182+date; 255 | break; 256 | case 'Reaping': 257 | ordinal = 189+date; 258 | break; 259 | case 'Goodmonth': 260 | ordinal = 217+date; 261 | break; 262 | case 'Harvester': 263 | ordinal = 245+date; 264 | break; 265 | case 'Brewfest': 266 | ordinal = 273+date; 267 | break; 268 | case 'Patchwall': 269 | ordinal = 280+date; 270 | break; 271 | case 'Readyreat': 272 | ordinal = 308+date; 273 | break; 274 | case 'Sunsebb': 275 | ordinal = 336+date; 276 | break; 277 | } 278 | state.Calendar.now.ordinal = ordinal; 279 | }, 280 | 281 | getsuffix = function(day) { 282 | 283 | var date = Number(day) 284 | var suffix 285 | 286 | if (date == 1 || date == 21 ){ 287 | suffix = 'st'; 288 | }else if (date == 2 || date == 22){ 289 | suffix = 'nd'; 290 | }else if (date == 3 || date == 23){ 291 | suffix = 'rd'; 292 | }else{ 293 | suffix = 'th'; 294 | } 295 | 296 | return suffix; 297 | }, 298 | 299 | getdown = function(days) { 300 | var down = Number(days) 301 | down = Math.floor(down/state.Calendar.now.div); 302 | return down; 303 | }, 304 | 305 | addday = function(add) { 306 | var ordinal = Number(add) 307 | state.Calendar.now.down = Number(state.Calendar.now.down)+ordinal 308 | ordinal = ordinal + Number(state.Calendar.now.ordinal); 309 | 310 | if(ordinal>364){ 311 | ordinal=ordinal-364; 312 | state.Calendar.now.year = Number(state.Calendar.now.year)+1; 313 | } 314 | 315 | state.Calendar.now.ordinal = ordinal; 316 | }, 317 | 318 | weather = function() { //--Weather generator function is disabled so that I can set the weather MUAHAHAHAHAHA 319 | var roll; 320 | var temperature; 321 | var wind; 322 | var precipitation; 323 | var season; 324 | var ordinal = state.Calendar.now.ordinal; 325 | 326 | if(ordinal > 336 || ordinal <= 35){ 327 | season = 'Winter' 328 | }else if(ordinal > 35 && ordinal <= 98){ 329 | season = 'Spring' 330 | }else if(ordinal > 98 && ordinal <=273 ){ 331 | season = 'Summer' 332 | }else if(ordinal > 273 && ordinal <=336 ){ 333 | season = 'Fall' 334 | } 335 | 336 | roll = Math.floor(Math.random()*(20-1+1)+1); 337 | if(roll>=15 && roll<=17){ 338 | switch(season) { 339 | case 'Winter': 340 | temperature = 'It is a bitterly cold winter day. '; 341 | break; 342 | case 'Spring': 343 | temperature = 'It is a cold spring day. '; 344 | break; 345 | case 'Summer': 346 | temperature = 'It is a cool summer day. '; 347 | break; 348 | case 'Fall': 349 | temperature = 'It is a cold fall day. '; 350 | break; 351 | } 352 | }else if(roll>=18 && roll<=20){ 353 | switch(season) { 354 | case 'Winter': 355 | temperature = 'It is a warm winter day. '; 356 | break; 357 | case 'Spring': 358 | temperature = 'It is a hot spring day. '; 359 | break; 360 | case 'Summer': 361 | temperature = 'It is a blisteringly hot summer day. '; 362 | break; 363 | case 'Fall': 364 | temperature = 'It is a hot fall day. '; 365 | break; 366 | } 367 | }else{ 368 | switch(season) { 369 | case 'Winter': 370 | temperature = 'It is a cold winter day. '; 371 | break; 372 | case 'Spring': 373 | temperature = 'It is a mild spring day. '; 374 | break; 375 | case 'Summer': 376 | temperature = 'It is a hot summer day. '; 377 | break; 378 | case 'Fall': 379 | temperature = 'It is a mild fall day. '; 380 | break; 381 | } 382 | 383 | } 384 | 385 | roll = Math.floor(Math.random()*(20-1+1)+1); 386 | if(roll>=15 && roll<=17){ 387 | wind='There is a light breeze and '; 388 | }else if(roll>=18 && roll<=20){ 389 | wind='There is a howling wind and '; 390 | }else{ 391 | wind='The air is still and '; 392 | } 393 | 394 | roll = Math.floor(Math.random()*(20-1+1)+1); 395 | if(roll>=15 && roll<=17){ 396 | precipitation="Light rain or snow."; 397 | if(season=='Winter'){ 398 | precipitation = 'snow falls softly on the ground.'; 399 | }else{ 400 | precipitation = 'a light rain falls from the sky.'; 401 | } 402 | }else if(roll>=18 && roll<=20){ 403 | if(season=='Winter'){ 404 | precipitation = 'snow falls thick and fast from the sky.'; 405 | }else{ 406 | precipitation = 'a torrential rain begins to fall.'; 407 | } 408 | }else{ 409 | roll = Math.floor(Math.random()*(2-1+1)+1); 410 | if(roll=1){ 411 | precipitation = 'the sky is overcast.'; 412 | }else{ 413 | precipitation = 'the sky is clear.'; 414 | } 415 | } 416 | 417 | var forecast=temperature+wind+precipitation;; 418 | state.Calendar.now.weather = forecast; 419 | }, 420 | getmoons = function(){ 421 | var celene_phase; 422 | var luna_phase; 423 | var ordinal = state.Calendar.now.ordinal;; 424 | //-- Calcualte Luna's Phase //-- 425 | if(4<=ordinal && ordinal <11) 426 | { 427 | luna_phase = 'is new'; 428 | } 429 | else if(32<=ordinal && ordinal <39) 430 | { 431 | luna_phase = 'is new'; 432 | } 433 | else if(60<=ordinal && ordinal <67) 434 | { 435 | luna_phase = 'is new'; 436 | } 437 | else if(88<=ordinal && ordinal <95) 438 | { 439 | luna_phase = 'is new'; 440 | } 441 | else if(116<=ordinal && ordinal <123) 442 | { 443 | luna_phase = 'is new'; 444 | } 445 | else if(144<=ordinal && ordinal <151) 446 | { 447 | luna_phase = 'is new'; 448 | } 449 | else if(172<=ordinal && ordinal <179) 450 | { 451 | luna_phase = 'is new'; 452 | } 453 | else if(200<=ordinal && ordinal <207) 454 | { 455 | luna_phase = 'is new'; 456 | } 457 | else if(228<=ordinal && ordinal <238) 458 | { 459 | luna_phase = 'is new'; 460 | } 461 | else if(256<=ordinal && ordinal <263) 462 | { 463 | luna_phase = 'is new'; 464 | } 465 | else if(284<=ordinal && ordinal <291) 466 | { 467 | luna_phase = 'is new'; 468 | } 469 | else if(312<=ordinal && ordinal <319) 470 | { 471 | luna_phase = 'is new'; 472 | } 473 | else if(340<=ordinal && ordinal <347) 474 | { 475 | luna_phase = 'is new'; 476 | } 477 | else if(11<=ordinal && ordinal<18) 478 | { 479 | luna_phase = 'is waxing'; 480 | } 481 | else if(39<=ordinal && ordinal<46) 482 | { 483 | luna_phase = 'is waxing'; 484 | } 485 | else if(67<=ordinal && ordinal<74) 486 | { 487 | luna_phase = 'is waxing'; 488 | } 489 | else if(95<=ordinal && ordinal<102) 490 | { 491 | luna_phase = 'is waxing'; 492 | } 493 | else if(123<=ordinal && ordinal<130) 494 | { 495 | luna_phase = 'is waxing'; 496 | } 497 | else if(151<=ordinal && ordinal<158) 498 | { 499 | luna_phase = 'is waxing'; 500 | } 501 | else if(179<=ordinal && ordinal<186) 502 | { 503 | luna_phase = 'is waxing'; 504 | } 505 | else if(207<=ordinal && ordinal<214) 506 | { 507 | luna_phase = 'is waxing'; 508 | } 509 | else if(235<=ordinal && ordinal<242) 510 | { 511 | luna_phase = 'is waxing'; 512 | } 513 | else if(263<=ordinal && ordinal<270) 514 | { 515 | luna_phase = 'is waxing'; 516 | } 517 | else if(291<=ordinal && ordinal<298) 518 | { 519 | luna_phase = 'is waxing'; 520 | } 521 | else if(319<=ordinal && ordinal<326) 522 | { 523 | luna_phase = 'is waxing'; 524 | } 525 | else if(347<=ordinal && ordinal<354) 526 | { 527 | luna_phase = 'is waxing'; 528 | } 529 | else if(18<=ordinal && ordinal<25) 530 | { 531 | luna_phase = 'is full'; 532 | } 533 | else if(46<=ordinal && ordinal<53) 534 | { 535 | luna_phase = 'is full'; 536 | } 537 | else if(74<=ordinal && ordinal<81) 538 | { 539 | luna_phase = 'is full'; 540 | } 541 | else if(102<=ordinal && ordinal<109) 542 | { 543 | luna_phase = 'is full'; 544 | } 545 | else if(130<=ordinal && ordinal<137) 546 | { 547 | luna_phase = 'is full'; 548 | } 549 | else if(158<=ordinal && ordinal<165) 550 | { 551 | luna_phase = 'is full'; 552 | } 553 | else if(186<=ordinal && ordinal<193) 554 | { 555 | luna_phase = 'is full'; 556 | } 557 | else if(214<=ordinal && ordinal<221) 558 | { 559 | luna_phase = 'is full'; 560 | } 561 | else if(242<=ordinal && ordinal<249) 562 | { 563 | luna_phase = 'is full'; 564 | } 565 | else if(270<=ordinal && ordinal<277) 566 | { 567 | luna_phase = 'is full'; 568 | } 569 | else if(298<=ordinal && ordinal<305) 570 | { 571 | luna_phase = 'is full'; 572 | } 573 | else if(326<=ordinal && ordinal<333) 574 | { 575 | luna_phase = 'is full'; 576 | } 577 | else if(354<=ordinal && ordinal<361) 578 | { 579 | luna_phase = 'is full'; 580 | } 581 | else if(oridinal>4 && ordinal>1) 582 | { 583 | luna_phase = 'is waning'; 584 | } 585 | else if(ordinal>=25 && oridinal>32) 586 | { 587 | luna_phase = 'is waning'; 588 | } 589 | else if(ordinal>=53 && oridinal>60) 590 | { 591 | luna_phase = 'is waning'; 592 | } 593 | else if(ordinal>=81 && oridinal>89) 594 | { 595 | luna_phase = 'is waning'; 596 | } 597 | else if(ordinal>=109 && oridinal>116) 598 | { 599 | luna_phase = 'is waning'; 600 | } 601 | else if(ordinal>=137 && oridinal>144) 602 | { 603 | luna_phase = 'is waning'; 604 | } 605 | else if(ordinal>=165 && oridinal>172) 606 | { 607 | luna_phase = 'is waning'; 608 | } 609 | else if(ordinal>=193 && oridinal>200) 610 | { 611 | luna_phase = 'is waning'; 612 | } 613 | else if(ordinal>=221 && oridinal>228) 614 | { 615 | luna_phase = 'is waning'; 616 | } 617 | else if(ordinal>=249 && oridinal>256) 618 | { 619 | luna_phase = 'is waning'; 620 | } 621 | else if(ordinal>=277 && oridinal>284) 622 | { 623 | luna_phase = 'is waning'; 624 | } 625 | else if(ordinal>=305 && oridinal>312) 626 | { 627 | luna_phase = 'is waning'; 628 | } 629 | else if(ordinal>=333 && oridinal>340) 630 | { 631 | luna_phase = 'is waning'; 632 | } 633 | else if(oridinal<=361 && ordinal>364) 634 | { 635 | luna_phase = 'is waning'; 636 | } 637 | else 638 | { 639 | luna_phase = 'is missing from the night sky'; 640 | } 641 | //-- Calcualte Celene's Phase //-- && 141<=ordinal<164 && 232<=ordinal<255 && 323<=ordinal<346) 642 | if(4<=ordinal&& ordinal<27) 643 | { 644 | celene_phase = 'is full'; 645 | } 646 | else if(95<=ordinal&& ordinal<118) 647 | { 648 | celene_phase = 'is full'; 649 | } 650 | else if(186<=ordinal&& ordinal<209) 651 | { 652 | celene_phase = 'is full'; 653 | } 654 | else if(277<=ordinal&& ordinal<300) 655 | { 656 | celene_phase = 'is full'; 657 | } 658 | else if(27<=ordinal && ordinal<50) 659 | { 660 | celene_phase = 'is waning'; 661 | } 662 | else if(118<=ordinal && ordinal<141) 663 | { 664 | celene_phase = 'is waning'; 665 | } 666 | else if(209<=ordinal && ordinal<232) 667 | { 668 | celene_phase = 'is waning'; 669 | } 670 | else if(300<=ordinal && ordinal<323) 671 | { 672 | celene_phase = 'is waning'; 673 | } 674 | else if(ordinal>=1 && ordinal < 4) 675 | { 676 | celene_phase = 'is waxing'; 677 | } 678 | else if(73<=ordinal && ordinal < 96) 679 | { 680 | celene_phase = 'is waxing'; 681 | } 682 | else if(164<=ordinal && ordinal < 187) 683 | { 684 | celene_phase = 'is waxing'; 685 | } 686 | else if(255<=ordinal && ordinal < 278) 687 | { 688 | celene_phase = 'is waxing'; 689 | } 690 | else if( ordinal >= 346 && ordinal < 364) 691 | { 692 | celene_phase = 'is waxing'; 693 | } 694 | else if(141<=ordinal<164) 695 | { 696 | celene_phase = 'is new'; 697 | } 698 | else if(232<=ordinal<255) 699 | { 700 | celene_phase = 'is new'; 701 | } 702 | else if(323<=ordinal<346) 703 | { 704 | celene_phase = 'is new'; 705 | } 706 | else 707 | { 708 | celene_phase = 'is missing from the night sky'; 709 | } 710 | state.Calendar.now.luna = luna_phase; 711 | state.Calendar.now.celene = celene_phase; 712 | }, 713 | checkInstall = function() { 714 | // Check if the Calendar property exists, creating it if it doesn't 715 | if( ! state.Calendar ) { 716 | setDefaults(); 717 | } 718 | }, 719 | 720 | registerEventHandlers = function() { 721 | on('chat:message', handleInput); 722 | }; 723 | 724 | return { 725 | CheckInstall: checkInstall, 726 | RegisterEventHandlers: registerEventHandlers 727 | }; 728 | 729 | }()); 730 | 731 | on("ready",function(){ 732 | 'use strict'; 733 | Calendar.CheckInstall(); 734 | Calendar.RegisterEventHandlers(); 735 | }); 736 | -------------------------------------------------------------------------------- /Magic Store v2.0.0: -------------------------------------------------------------------------------- 1 | // Magic store generator for D&D 5e 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | 5 | // API Commands: 6 | // !ms - Pulls up the menu and allows the GM to generate and modify the store 7 | // !shop - Puts the virtual store in chat for the players to peruse 8 | 9 | 10 | // Red Colour: #7E2D40 11 | 12 | 13 | var MagicStore = MagicStore || (function() { 14 | 'use strict'; 15 | 16 | var version = '2.0.0', 17 | 18 | setDefaults = function() { 19 | state.store = { 20 | now: { 21 | version: '2.0.0', 22 | inventory: "Adamantine Armor,500,Amulet of Health,8000,Bag of Holding,4000" 23 | }, 24 | }; 25 | }, 26 | 27 | checkDefaults = function() { 28 | if( state.store.now.version != version ){ 29 | state.store.now.version = version; 30 | } 31 | if( ! state.store.now.inventory){state.store.now.inventory = "Adamantine Armor,500,Amulet of Health,8000,Bag of Holding,4000"}; 32 | }, 33 | 34 | handleInput = function(msg) { 35 | var args = msg.content.split(","); 36 | 37 | if (msg.type !== "api") { 38 | return; 39 | } 40 | 41 | if(playerIsGM(msg.playerid)){ 42 | switch(args[0]) { 43 | case '!ms': 44 | storeMenu(); 45 | break; 46 | case '!ms_inventory': 47 | getInventory(msg); 48 | storeMenu(); 49 | break; 50 | case '!shop': 51 | shop(); 52 | break; 53 | } 54 | } 55 | }, 56 | 57 | storeMenu = function() { 58 | var colour = '#7E2D40'; 59 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 60 | var astyle1 = 'style="text-align:center; border: 1px solid black; margin: 1px; padding: 2px; background-color: ' + colour + '; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 166px;'; 61 | var astyle2 = 'style="text-align:center; border: 1px solid black; margin: 1px; padding: 2px; background-color: ' + colour + '; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 80px;'; 62 | var tablestyle ='style="text-align:center; font-size: 12px; width: 100%;"'; 63 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid ' + colour + '; margin-bottom: 2px; margin-top: 2px;"'; 64 | var headstyle = 'style="color: ' + colour + '; font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 65 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -2px; font-style: italic;"'; 66 | var trstyle = 'style="border-top: 1px solid #cccccc; text-align: left;"'; 67 | var tdstyle = 'style="text-align: right;"'; 68 | 69 | var inventory = state.store.now.inventory; 70 | var items = inventory.split(","); 71 | var invList = ''; 72 | var i = 0; 73 | 74 | for (i = 0; i < items.length; i += 2) { 75 | invList += '' + items[i] + '' + items[i+1] + ''; 76 | } 77 | 78 | sendChat('Magic Store', '/w gm
' + //-- 79 | '
Magic Store
' + //-- 80 | '
Menu (v.' + state.store.now.version + ')
' + //-- 81 | '
' + //-- 82 | '' + //-- 83 | '' + //-- 84 | invList + //-- 85 | '
ItemPrice (gp)
'+ //-- 86 | '
Scrolls' + //-- 87 | 'Potions
' + //-- 88 | '
Weapons' + //-- 89 | 'Armour
' + //-- 90 | '
Items' + //-- 91 | 'Random
' + //-- 92 | '' + //-- 93 | '
' 94 | ); 95 | }, 96 | 97 | shop = function() { 98 | var colour = '#7E2D40'; 99 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 100 | var tablestyle ='style="text-align:center; font-size: 12px; width: 100%;"'; 101 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid ' + colour + '; margin-bottom: 2px; margin-top: 2px;"'; 102 | var headstyle = 'style="color: ' + colour + '; font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 103 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -2px; font-style: italic;"'; 104 | var trstyle = 'style="border-top: 1px solid #cccccc; text-align: left;"'; 105 | var tdstyle = 'style="text-align: right;"'; 106 | 107 | var inventory = state.store.now.inventory; 108 | var items = inventory.split(","); 109 | var invList = ''; 110 | var i = 0; 111 | 112 | for (i = 0; i < items.length; i += 2) { 113 | invList += '' + items[i] + '' + items[i+1] + ''; 114 | } 115 | 116 | sendChat('Magic Store', '/w gm
' + //-- 117 | '
Magic Store
' + //-- 118 | '
Menu (v.' + state.store.now.version + ')
' + //-- 119 | '
' + //-- 120 | '' + //-- 121 | '' + //-- 122 | invList + //-- 123 | '
ItemPrice (gp)
'+ //-- 124 | '
' 125 | ); 126 | }, 127 | 128 | 129 | 130 | getInventory = function(msg) { 131 | var args = msg.content.split(","); 132 | var type = args[1]; 133 | var rarity; 134 | 135 | var i; 136 | var newInv = ""; 137 | var randNo; 138 | 139 | for (i = 0; i < args[2]; i ++) { 140 | 141 | if (i>0){newInv += ','} 142 | 143 | rarity = getRarity(args[3]); 144 | randNo = randomInteger(5); 145 | 146 | if (type == 'scroll'){newInv += getScroll(rarity)} 147 | if (type == 'potion'){newInv += getPotion(rarity)} 148 | if (type == 'weapon'){newInv += getWeapon(rarity)} 149 | if (type == 'armour'){newInv += getArmour(rarity)} 150 | if (type == 'item'){newInv += getItem(rarity)} 151 | if (type == 'random'){ 152 | switch(randNo) { 153 | case 1: 154 | newInv += getScroll(rarity); 155 | break; 156 | case 2: 157 | newInv += getPotion(rarity); 158 | break; 159 | case 3: 160 | newInv += getWeapon(rarity); 161 | break; 162 | case 4: 163 | newInv += getArmour(rarity); 164 | break; 165 | case 5: 166 | newInv += getItem(rarity); 167 | break; 168 | } 169 | } 170 | } 171 | 172 | state.store.now.inventory = newInv; 173 | }, 174 | 175 | getRarity = function(max) { 176 | var maxrare = max; 177 | var invNo = randomInteger(maxrare); 178 | var rarity; 179 | 180 | if (invNo < 51){ 181 | rarity = "common"; 182 | } else if (invNo < 81) { 183 | rarity = "uncommon"; 184 | } else if (invNo < 91) { 185 | rarity = "rare"; 186 | } else if (invNo < 100) { 187 | rarity = "very rare"; 188 | } else { 189 | rarity = "legendary"; 190 | } 191 | 192 | return rarity; 193 | }, 194 | 195 | getScroll = function(rarity) { 196 | var item; 197 | var level; 198 | 199 | switch(rarity) { 200 | case 'common': 201 | level = randomInteger(2); 202 | if (level == 2){level = 0} 203 | item = rollSpell(level); 204 | break; 205 | case 'uncommon': 206 | level = randomInteger(2); 207 | if (level == 1){ 208 | level = 2; 209 | }else{ 210 | level = 3; 211 | } 212 | item = rollSpell(level); 213 | break; 214 | case 'rare': 215 | level = randomInteger(2); 216 | if (level == 1){ 217 | level = 4; 218 | }else{ 219 | level = 5; 220 | } 221 | item = rollSpell(level); 222 | break; 223 | case 'very rare': 224 | level = randomInteger(3); 225 | if (level == 1){ 226 | level = 6; 227 | }else if(level == 2){ 228 | level = 7; 229 | }else{ 230 | level = 8; 231 | } 232 | item = rollSpell(level); 233 | break; 234 | case 'legendary': 235 | level = 9; 236 | item = rollSpell(level); 237 | break; 238 | } 239 | 240 | return item; 241 | }, 242 | 243 | rollSpell = function(level) { 244 | var spellList; 245 | 246 | switch(level) { 247 | case 0: 248 | spellList = "Acid Splash,10;Blade Ward,10;Booming Blade,10;Chill Touch,10;Control Flames,10;Create Bonfire,10;Dancing Lights,10;Druidcraft,10;Eldritch Blast,10;Fire Bolt,10;Friends,10;Frostbite,10;Green-Flame Blade,10;Guidance,10;Gust,10;Infestation,10;Light,10;Lightning Lure,10;Mage Hand,10;Magic Stone,10;Mending,10;Message,10;Minor Illusion,10;Mold earth,10;Poison Spray,10;Prestidigitation,10;Primal Savagery,10;Produce Flame,10;Ray of Frost,10;Resistance,10;Sacred Flame,10;Shape Water,10;Shillelagh,10;Shocking Grasp,10;Spare the Dying,10;Sword Burst,10;Thaumaturgy,10;Thorn Whip,10;Thunderclap,10;Toll the Dead,10;True Strike,10;Vicious Mockery,10;Word of Radiance,10"; 249 | break; 250 | case 1: 251 | spellList = "Absorb Elements,60;Alarm,60;Animal Friendship,60;Armor of Agathys,60;Arms of Hadar,60;Bane,60;Beast Bond,60;Bless,60;Burning Hands,60;Catapult,60;Cause Fear,60;Ceremony,60;Chaos Bolt,60;Charm Person,60;Chromatic Orb,60;Color Spray,60;Command,60;Compelled Duel,60;Comprehend Languages,60;Create or Destroy Water,60;Cure Wounds,60;Detect Evil and Good,60;Detect Magic,60;Detect Poison and Disease,60;Disguise Self,60;Dissonant Whispers,60;Divine Favor,60;Earth Tremor,60;Ensnaring Strike,60;Entangle,60;Expeditious Retreat,60;Faerie Fire,60;False Life,60;Feather Fall,60;Find Familiar,60;Fog Cloud,60;Goodberry,60;Grease,60;Guiding Bolt,60;Hail of Thorns,60;Healing Word,60;Hellish Rebuke,60;Heroism,60;Hex,60;Hunter’s Mark,60;Ice Knife,60;Identify,60;Illusory Script,60;Inflict Wounds,60;Jump,60;Longstrider,60;Mage Armor,60;Magic Missile,60;Protection from Evil and Good,60;Purify Food and Drink,60;Ray of Sickness,60;Sanctuary,60;Searing Smite,60;Shield,60;Shield of Faith,60;Silent Image,60;Sleep,60;Snare,60;Speak with Animals,60;Tasha’s Hideous Laughter,60;Tenser’s Floating Disk,60;Thunderous Smite,60;Thunderwave,60;Unseen Servant,60;Witch Bolt,60;Wrathful Smite,60;Zephyr Strike,60"; 252 | break; 253 | case 2: 254 | spellList = "Aganazzar’s Scorcher,120;Aid,120;Alter Self,120;Animal Messenger,120;Arcane Lock,120;Augury,120;Barkskin,120;Beast Sense,120;Blindness/Deafness,120;Blur,120;Branding Smite,120;Calm Emotions,120;Cloud of Daggers,120;Continual Flame,120;Cordon of Arrows,120;Crown of Madness,120;Darkness,120;Darkvision,120;Detect Thoughts,120;Dragon's Breath,120;Dust Devil,120;Earthbind,120;Enhance Ability,120;Enlarge/Reduce,120;Enthrall,120;Find Steed,120;Find Traps,120;Flame Blade,120;Flaming Sphere,120;Gentle Repose,120;Gust of Wind,120;Healing Spirit,120;Heat Metal,120;Hold Person,120;Invisibility,120;Knock,120;Lesser Restoration,120;Levitate,120;Locate Animals or Plants,120;Locate Object,120;Magic Mouth,120;Magic Weapon,120;Maximilian’s Earthen Grasp,120;Melf’s Acid Arrow,120;Mind Spike,120;Mirror Image,120;Misty Step,120;Moonbeam,120;Nystul’s Magic Aura,120;Pass Without Trace,120;Phantasmal Force,120;Prayer of Healing,120;Protection from Poison,120;Pyrotechnics,120;Ray of Enfeeblement,120;Rope Trick,120;Scorching Ray,120;See invisibility,120;Shadow Blade,120;Shatter,120;Silence,120;Skywrite,120;Snilloc’s Snowball Swarm,120;Spider Climb,120;Spike Growth,120;Spiritual Weapon,120;Suggestion,120;Warding Bond,120;Warding Wind,120;Web,120;Zone of Truth,120"; 255 | break; 256 | case 3: 257 | spellList = "Animate Dead,200;Aura of Vitality,200;Beacon of Hope,200;Bestow Curse,200;Blinding Smite,200;Blink,200;Call Lightning,200;Catnap,200;Clairvoyance,200;Conjure Animals,200;Conjure Barrage,200;Counterspell,200;Create Food and Water,200;Crusader’s Mantle,200;Daylight,200;Dispel Magic,200;Elemental Weapon,200;Erupting Earth,200;Fear,200;Feign Death,200;Fireball,200;Flame Arrows,200;Fly,200;Gaseous Form,200;Glyph of Warding,200;Haste,200;Hunger of Hadar,200;Hypnotic Pattern,200;Leomund’s Tiny Hut,200;Lightning Arrow,200;Lightning Bolt,200;Magic Circle,200;Major Image,200;Mass Healing Word,200;Meld into Stone,200;Melf’s Minute Meteors,200;Nondetection,200;Phantom Steed,200;Plant Growth,200;Protection from Energy,200;Remove Curse,200;Revivify,200;Sending,200;Sleet Storm,200;Slow,200;Speak with Dead,200;Speak with Plants,200;Spirit Guardians,200;Stinking Cloud,200;Tidal Wave,200;Tongues,200;Vampiric Touch,200;Wall of Sand,200;Wall of Water,200;Water Breathing,200;Water Walk,200;Wind Wall,200;Enemies abound,200;Life Transference,200;Summon Lesser Demons,200;Thunder Step,200;Tiny Servant,200"; 258 | break; 259 | case 4: 260 | spellList = "Arcane Eye,320;Aura of Life,320;Aura of Purity,320;Banishment,320;Blight,320;Compulsion,320;Confusion,320;Conjure Minor Elementals,320;Conjure Woodland Beings,320;Control Water,320;Death Ward,320;Dimension Door,320;Divination,320;Dominate Beast,320;Elemental Bane,320;Evard’s Black Tentacles,320;Fabricate,320;Fire Shield,320;Freedom of Movement,320;Giant Insect,320;Grasping Vine,320;Greater Invisibility,320;Guardian of Faith,320;Hallucinatory Terrain,320;Ice Storm,320;Leomund’s Secret Chest,320;Locate Creature,320;Mordenkainen’s Faithful Hound,320;Mordenkainen’s Private Sanctum,320;Otiluke’s Resilient Sphere,320;Phantasmal Killer,320;Polymorph,320;Staggering Smite,320;Stone Shape,320;Stoneskin,320;Storm Sphere,320;Vitriolic Sphere,320;Wall of Fire,320;Watery Sphere,320;Charm Monster,320;Find Greater Steed,320;Guardian of Nature,320;Shadow of Moil,320;Sickening Radiance,320;Summon Greater Demon,320"; 261 | break; 262 | case 5: 263 | spellList = "Animate Objects,640;Antilife Shell,640;Awaken,640;Banishing Smite,640;Bigby’s Hand,640;Circle of Power,640;Cloudkill,640;Commune,640;Commune with Nature,640;Cone of Cold,640;Conjure Elemental,640;Conjure Volley,640;Contact Other Plane,640;Contagion,640;Control Winds,640;Creation,640;Destructive Wave,640;Dispel Evil and Good,640;Dominate Person,640;Dream,640;Flame Strike,640;Geas,640;Greater Restoration,640;Hallow,640;Hold Monster,640;Immolation,640;Insect Plague,640;Legend Lore,640;Maelstrom,640;Mass Cure Wounds,640;Mislead,640;Modify Memory,640;Passwall,640;Planar Binding,640;Raise Dead,640;Rary’s Telepathic Bond,640;Reincarnate,640;Scrying,640;Seeming,640;Swift Quiver,640;Telekinesis,640;Teleportation Circle,640;Transmute Rock,640;Tree Stride,640;Wall of Force,640;Wall of Stone,640;Danse Macabre,640;Dawn,640;Druid Grove,640;Enervation,640;Far Step,640;Holy Weapon,640;Infernal Calling,640;Negative Energy Flood,640;Skill Empowerment,640;Steel Wind Strike,640;Synaptic Static,640;Wall of Light,640;Wrath of Nature,640"; 264 | break; 265 | case 6: 266 | spellList = "Arcane Gate,1280;Blade Barrier,1280;Bones of the Earth,1280;Chain Lightning,1280;Circle of Death,1280;Conjure Fey,1280;Contingency,1280;Create Undead,1280;Disintegrate,1280;Drawmij’s Instant Summons,1280;Eyebite,1280;Find the Path,1280;Flesh to Stone,1280;Forbiddance,1280;Globe of Invulnerability,1280;Guards and Wards,1280;Harm,1280;Heal,1280;Heroes’ Feast,1280;Investiture of Flame,1280;Investiture of Ice,1280;Investiture of Stone,1280;Investiture of Wind,1280;Magic Jar,1280;Mass Suggestion,1280;Move Earth,1280;Otiluke’s Freezing Sphere,1280;Otto’s Irresistible Dance,1280;Planar Ally,1280;Primordial Ward,1280;Programmed Illusion,1280;Sunbeam,1280;Transport via Plants,1280;True Seeing,1280;Wall of Ice,1280;Wall of Thorns,1280;Wind Walk,1280;Word of Recall,1280;Create Homunculus,1280;Mental Prison,1280;Primordial Ward,1280;Scatter,1280;Soul Cage,1280;Tenser’s Transformation,1280"; 267 | break; 268 | case 7: 269 | spellList = "Conjure Celestial,2560;Delayed Blast Fireball,2560;Divine Word,2560;Etherealness,2560;Finger of Death,2560;Fire Storm,2560;Forcecage,2560;Mirage Arcane,2560;Mordenkainen’s Magnificent Mansion,2560;Mordenkainen’s Sword,2560;Plane Shift,2560;Prismatic Spray,2560;Project Image,2560;Regenerate,2560;Resurrection,2560;Reverse Gravity,2560;Sequester,2560;Simulacrum,2560;Symbol,2560;Teleport,2560;Whirlwind,2560;Crown of Stars,2560;Power Word Pain,2560;Temple of the Gods,2560"; 270 | break; 271 | case 8: 272 | spellList = "Abi-Dalzim’s Horrid Wilting,5120;Animal Shapes,5120;Antimagic Field,5120;Antipathy/Sympathy,5120;Clone,5120;Control Weather,5120;Demiplane,5120;Dominate Monster,5120;Earthquake,5120;Feeblemind,5120;Glibness,5120;Holy Aura,5120;Incendiary Cloud,5120;Maze,5120;Mind Blank,5120;Power Word Stun,5120;Sunburst,5120;Telepathy,5120;Trap the Soul,5120;Tsunami,5120;Illusory Dragon,5120;Maddening Darkness,5120;Mighty Fortress,5120"; 273 | break; 274 | case 9: 275 | spellList = "Astral Projection,10240;Foresight,10240;Gate,10240;Imprisonment,10240;Mass Heal,10240;Meteor Swarm,10240;Power Word Heal,10240;Power Word Kill,10240;Prismatic Wall,10240;Shapechange,10240;Storm of Vengeance,10240;Time Stop,10240;True Polymorph,10240;True Resurrection,10240;Weird,10240;Wish,10240;Invulnerability,10240;Mass Polymorph,10240;Psychic Scream,10240"; 276 | break; 277 | } 278 | 279 | 280 | var itemsList = spellList.split(";"); 281 | var len = itemsList.length; 282 | 283 | var number = randomInteger(len) - 1; 284 | var item = 'Scroll: ' + itemsList[number]; 285 | 286 | return item; 287 | }, 288 | 289 | getPotion = function(rarity) { 290 | var potionList; 291 | 292 | switch(rarity) { 293 | case 'common': 294 | potionList = "Potion of Climbing,180;Potion of Healing,50"; 295 | break; 296 | case 'uncommon': 297 | potionList = "Oil of Slipperiness,480;Philter of Love,90;Potion of Animal Friendship,200;Potion of Fire Breath,150;Potion of Greater Healing,150;Potion of Growth,270;Potion of Poison,100;Potion of Resistance,300;Potion of Water Breathing,180"; 298 | break; 299 | case 'rare': 300 | potionList = "Elixir of Health,120;Oil of Etherealness,1920;Potion of Clairvoyance,960;Potion of Diminution,270;Potion of Gaseous Form,300;Potion of Heroism,180;Potion of Invulnerability,3840;Potion of Mind Reading,180"; 301 | break; 302 | case 'very rare': 303 | potionList = "Oil of Sharpness,3200;Potion of Flying,500;Potion of Invisibility,180;Potion of Longevity,9000;Potion of Speed,400;Potion of Superior Healing,450;Potion of Supreme Healing,1350;Potion of Vitality,960"; 304 | break; 305 | case 'legendary': 306 | potionList = "Oil of Sharpness,3200;Potion of Flying,500;Potion of Invisibility,180;Potion of Longevity,9000;Potion of Speed,400;Potion of Superior Healing,450;Potion of Supreme Healing,1350;Potion of Vitality,960"; 307 | break; 308 | } 309 | 310 | var itemsList = potionList.split(";"); 311 | var len = itemsList.length; 312 | 313 | var number = randomInteger(len) - 1; 314 | var item = itemsList[number]; 315 | 316 | return item; 317 | }, 318 | 319 | getWeapon = function(rarity) { 320 | var weaponList = "Club,0.1;Dagger,2;Greatclub,0.2;Handaxe,5;Javelin,0.5;Light Hammer,2;Mace,5;Quarterstaff,0.2;Sickle,1;Spear,1;Crossbow (light),25;Dart,0.05;Shortbow,25;Sling,0.1;Battleaxe,10;Flail,10;Glaive,20;Greataxe,30;Greatsword,50;Halberd,20;Lance,10;Longsword,15;Maul,10;Morningstar,15;Pike,5;Rapier,25;Scimitar,25;Shortsword,10;Trident,5;War Pick,5;Warhammer,15;Whip,2;Blowgun,10;Crossbow (hand),75;Crossbow (heavy),50;Longbow,50;Net,1"; 321 | var itemsList = weaponList.split(";"); 322 | var len = itemsList.length; 323 | var number = randomInteger(len) - 1; 324 | var item = itemsList[number]; 325 | 326 | var selected = item.split(','); 327 | var weapon; 328 | var price; 329 | 330 | switch(rarity) { 331 | case 'common': 332 | weapon = selected[0]; 333 | price = selected[1]; 334 | break; 335 | case 'uncommon': 336 | weapon = '+1 ' + selected[0]; 337 | price = 1000 + Math.trunc(selected[1]); 338 | break; 339 | case 'rare': 340 | weapon = '+2 ' + selected[0]; 341 | price = 4000 + Math.trunc(selected[1]); 342 | break; 343 | case 'very rare': 344 | weapon = '+3 ' + selected[0]; 345 | price = 16000 + Math.trunc(selected[1]); 346 | break; 347 | case 'legendary': 348 | weapon = '+3 ' + selected[0]; 349 | price = 16000 + Math.trunc(selected[1]); 350 | break; 351 | } 352 | 353 | item = weapon + ',' + price; 354 | return item; 355 | }, 356 | 357 | getArmour = function(rarity) { 358 | var armourList = "Padded Armour,5;Leather Armour,10;Studded leather Armour,45;Hide Armour,10;Chain shirt Armour,50;Scale mail Armour,50;Breastplate Armour,400;Half plate Armour,750;Ring mail Armour,30;Chain mail Armour,75;Splint Armour,200;Plate Armour,1500"; 359 | var itemsList = armourList.split(";"); 360 | var len = itemsList.length; 361 | var number = randomInteger(len) - 1; 362 | var item = itemsList[number]; 363 | 364 | var selected = item.split(','); 365 | var armour; 366 | var price; 367 | 368 | switch(rarity) { 369 | case 'common': 370 | armour = selected[0]; 371 | price = selected[1]; 372 | break; 373 | case 'uncommon': 374 | armour = '+1 ' + selected[0]; 375 | price = 1500 + Math.trunc(selected[1]); 376 | break; 377 | case 'rare': 378 | armour = '+2 ' + selected[0]; 379 | price = 6000 + Math.trunc(selected[1]); 380 | break; 381 | case 'very rare': 382 | armour = '+3 ' + selected[0]; 383 | price = 24000 + Math.trunc(selected[1]); 384 | break; 385 | case 'legendary': 386 | armour = '+3 ' + selected[0]; 387 | price = 24000 + Math.trunc(selected[1]); 388 | break; 389 | } 390 | 391 | item = armour + ',' + price; 392 | return item; 393 | }, 394 | 395 | getItem = function(rarity) { 396 | var list; 397 | 398 | switch(rarity) { 399 | case 'common': 400 | list = "Armor of Gleaming,50;Bead of Nourishment,50;Bead of Refreshment,50;Boots of False Tracks,50;Candle of the Deep,50;Cast-off Armour,50;Charlatan\'s Die,50;Cloak of Billowing,50;Cloak of Many Fashions,50;Clockwork Amulet,50;Clothes of Mending,50;Dark Shard Amulet,50;Dread Helm,50;Ear Horn of Hearing,50;Enduring Spellbook,50;Ersatz Eye,50;Hat of Vermin,50;Hat of Wizardry,50;Heward\'s Handy Spice,50;Horn of Silent Alarm,50;Instrument of Illusions,50;Instrument of Scribing,50;Lock of Trickery,50;Moon-touched Sword,50;Mystery Key,50;Orb of Direction,50;Orb of Time,50;Perfume of Bewiching,50;Pipe of Smoke Monsters,50;Pole of Angling,50;Pole of Collapsing,50;Pot of Awakening,50;Rope of Mending,50;Ruby of the Wary Mage,50;Staff of Adornment,50;Staff of Birdcalls,50;Staff of Flowers,50;Talking Doll,50;Tankard of Sobriety,50;Unbreakable Arrow,50;Veteran\'s Cane,50;Walloping Ammunition,50;Wand of Conduction,50;Wand of Pyrotechnics,50;Wand of Scowls,50;Wand of Smiles,50"; 401 | break; 402 | case 'uncommon': 403 | list = "Alchemy Jug,6000;Amulet of Proof Against Detection and Location,20000;Bag of Holding,4000;Boots of Elvenkind,2500;Boots of Striding and Springing,5000;Boots of the Winterlands,10000;Bracers of Archery,1500;Brooch of Shielding,7500;Broom of Flying,8000;Cap of Water Breathing,1000;Circlet of Blasting,1500;Cloak of Elvenkind,5000;Cloak of Protection,3500;Cloak of the Manta Ray,6000;Decanter of Endless Water,135000;Deck of Illusions,6120;Driftglobe,750;Dust of Disappearance,300;Dust of Dryness (1 pellet),120;Dust of Sneezing and Choking,480;Elemental Gem,960;Eversmoking Bottle,1000;Eyes of Charming,3000;Eyes of Minute Seeing,2500;Eyes of the Eagle,2500;Gauntlets of Ogre Power,8000;Gem of Brightness,5000;Gloves of Missile Snaring,3000;Gloves of Swimming and Climbing,2000;Gloves of Thievery,5000;Goggles of Night,1500;Hat of Disguise,5000;Headband of Intellect,8000;Helm of Comprehend Languages,500;Helm of Telepathy,12000;Immovable Rod,5000;Instrument of the Bards - Doss Lute,28500;Instrument of the Bards - Fochulan Bandlore,26500;Instrument of the Bards - Mac-Fuirmidh Cittern,27000;Keoghtom\'s Ointment (Per dose),120;Lantern of Revealing,5000;Luckstone,4200;Medallion of Thoughts,3000;Necklace of Adaption,1500;Pearl of Power,6000;Periapt of Health,5000;Periapt of Wound Closure,5000;Pipes of Haunting,6000;Pipes of the Sewers,2000;Quiver of Ehlonna,1000;Ring of Jumping,2500;Ring of Mind Shielding,16000;Ring of Swimming,3000;Ring of Warmth,1000;Ring of Water Walking,1500;Robe of Useful Items,Items * 5;Rope of Climbing,2000;Saddle of the Cavalier,2000;Sending Stones,2000;Silver Raven,5000;Slippers of Spider Climbing,5000;Trident of Fish Command,800;Wind Fan,1500;Winged Boots,8000"; 404 | break; 405 | case 'rare': 406 | list = "Amulet of Health,8000;Bead of Force,960;Belt of Dwarvenkind,6000;Boots of Levitation,4000;Boots of Speed,4000;Bowl of Commanding Water Elementals,8000;Bracers of Defense,6000;Brass Horn of Valhalla,8400;Brazier of Commanding Fire Elementals,8000;Bronze Griffon,8000;Cape of the Mountebank,8000;Censer of Controlling Air Elementals,8000;Chime of Opening,1500;Cloak of Displacement,60000;Cloak of the Bat,6000;Cube of Force,16000;Daern\'s Instant Fortress,75000;Dimensional Shackles,3000;Ebony Fly,6000;Folding Boat,10000;Gem of Seeing,32000;Goldean Lion (ea),600;Helm of Teleportation,64000;Heward\'s Handy Haversack,2000;Horn of Blasting,450;Horseshoes of Speed,5000;Instrument of the Bards - Canaith Mandolin,30000;Instrument of the Bards - Cli Lyre,35000;Ioun Stone Awareness,12000;Ioun Stone Protection,1200;Ioun Stone Reserve,6000;Ioun Stone Sustenance,1000;Iron Bands of Bilarro,4000;Ivory Goat (Terror),20000;Ivory Goat (Travail),400;Ivory Goat (Traveling),1000;Mantle of Spell Resistance,30000;Marble Elephant,6000;Necklace of Fireballs (Five beads),3840;Necklace of Fireballs (Four beads),1600;Necklace of Fireballs (One bead),300;Necklace of Fireballs (Six beads),7680;Necklace of Fireballs (Three beads),960;Necklace of Fireballs (Two beads),480;Onyx Dog,3000;Periapt of Proof Against Poison,5000;Portable Hole,8000;Prayer Bead - Bless,2000;Prayer Bead - Curing,4000;Prayer Bead - Favor,32000;Prayer Bead - Smiting,1500;Prayer Bead - Summons,128000;Prayer Bead - Wind Walking,96000;Quaal\'s Feather Token Anchor,50;Quaal\'s Feather Token Bird,3000;Quaal\'s Feather Token Fan,250;Quaal\'s Feather Token Swan Boat,3000;Quaal\'s Feather Token Whip,250;Ring of Animal Influence,4000;Ring of Evasion,5000;Ring of Feather Falling,2000;Ring of Free Action,20000;Ring of Protection,3500;Ring of Resistance,6000;Ring of Spell Storing,24000;Ring of the Ram,5000;Ring of X-Ray Vision,6000;Robe of Eyes,30000;Rope of Entanglement,4000;Serpentine Owl,8000;Silver Horn of Valhalla,5600;Stone of Controlling Earth Elementals,8000;Wings of Flying,5000"; 407 | break; 408 | case 'very rare': 409 | list = "Amulet of the Planes,160000;Bronze Horn of Valhalla,11200;Carpet of Flying,12000;Cloak of Arachnida,5000;Crystal Ball,50000;Horseshoes of the Zephyr,1500;Instrument of the Bards - Anstruth Harp,109000;Ioun Stone Absorption,2400;Ioun Stone Agility,3000;Ioun Stone Fortitude,3000;Ioun Stone Insight,3000;Ioun Stone Intellect,3000;Ioun Stone Leadership,3000;Ioun Stone Strength,3000;Mirror of Life Trapping,18000;Nolzur\'s Marvelous Pigments,200;Obsidian Steed,128000;Ring of Regeneration,12000;Ring of Shooting Stars,14000;Ring of Telekinesis,80000;Robe of Scintillating Colors,6000;Robe of Stars,60000"; 410 | break; 411 | case 'legendary': 412 | list = "Apparatus of Kwalish,10000;Cloak of Invisibility,80000;Cubic Gate,40000;Efreeti Chain,20000;Instrument of the Bards - Ollamh Harp,125000;Ioun Stone Greater Absorption,31000;Ioun Stone Mastery,15000;Ioun Stone Regeneration,4000;Iron Horn of Valhalla,14000;Ring of Air Elemental Command,35000;Ring of Earth Elemental Command,31000;Ring of Fire Elemental Command,17000;Ring of Invisibility,10000;Ring of Spell Turning,30000;Ring of Water Elemental Command,25000;Robe of the Archmagi,34000;Scarab of Protection,36000;Sovereign Glue,400;Sphere of Annihilation,15000;Talisman of Pure Good,71680;Talisman of the Sphere,20000;Talisman of Ultimate Evil,61440;Universal Solvent,300"; 413 | break; 414 | } 415 | 416 | 417 | 418 | var itemsList = list.split(";"); 419 | var len = itemsList.length; 420 | 421 | var number = randomInteger(len) - 1; 422 | var item = itemsList[number]; 423 | 424 | sendChat("test","Item = " + item); 425 | 426 | return item; 427 | }, 428 | 429 | checkInstall = function() { 430 | if(typeof state.store == "undefined"){ 431 | setDefaults(); 432 | } 433 | 434 | if ( state.store.now.version != version ){ 435 | checkDefaults(); 436 | } 437 | }, 438 | 439 | registerEventHandlers = function() { 440 | on('chat:message', handleInput); 441 | }; 442 | 443 | 444 | return { 445 | CheckInstall: checkInstall, 446 | RegisterEventHandlers: registerEventHandlers 447 | }; 448 | 449 | }()); 450 | 451 | 452 | on("ready",function(){ 453 | 'use strict'; 454 | MagicStore.CheckInstall(); 455 | MagicStore.RegisterEventHandlers(); 456 | }); 457 | -------------------------------------------------------------------------------- /Multi-World Calendar v3.0.0: -------------------------------------------------------------------------------- 1 | // Calendar and down day counter for Faerun, Greyhawk, Eberron and Modern Settings 2 | // Created by Kirsty (https://app.roll20.net/users/1165285/kirsty) 3 | 4 | // API Commands: 5 | // !cal - for the GM displays the menu in the chat window, for a player displays date, weather, moon and down days 6 | 7 | // Red Colour: #7E2D40 8 | 9 | var Calendar = Calendar || (function() { 10 | 'use strict'; 11 | 12 | var version = '3.0.0', 13 | 14 | setDefaults = function() { 15 | state.Calendar = { 16 | now: { 17 | version: "3.0.0", 18 | world: 1, 19 | ordinal: 1, 20 | year: 1486, 21 | down: 0, 22 | divider: 0, 23 | weather: "It is a cool but sunny day.", 24 | time: "OFF", 25 | startdate: "1,Hammer,1486" 26 | }, 27 | }; 28 | }, 29 | 30 | checkDefaults = function() { 31 | if( ! state.Calendar.now.version){state.Calendar.now.version = "3.0.0"}; 32 | if( ! state.Calendar.now.world){state.Calendar.now.world = 1}; 33 | if( ! state.Calendar.now.ordinal){state.Calendar.now.ordinal = 1}; 34 | if( ! state.Calendar.now.year){state.Calendar.now.year = 1486}; 35 | if( ! state.Calendar.now.down){state.Calendar.now.down = '0'}; 36 | if( ! state.Calendar.now.divider){state.Calendar.now.divider = '0'}; 37 | if( ! state.Calendar.now.weather){state.Calendar.now.weather = "It is a cool but sunny day."}; 38 | if( ! state.Calendar.now.time){state.Calendar.now.time = "OFF"}; 39 | if( ! state.Calendar.now.startdate){state.Calendar.now.startdate = "1,Hammer,1486"}; 40 | }, 41 | 42 | handleInput = function(msg) { 43 | var args = msg.content.split(","); 44 | 45 | if (msg.type !== "api") { 46 | return; 47 | } 48 | 49 | if(playerIsGM(msg.playerid)){ 50 | switch(args[0]) { 51 | case '!cal': 52 | calmenu(); 53 | break; 54 | case '!setworld': 55 | state.Calendar.now.world=args[1]; 56 | calmenu(); 57 | break; 58 | case '!startdate': 59 | state.Calendar.now.startdate=args[1]+','+args[2]+','+args[3]; 60 | calmenu(); 61 | break; 62 | case '!setday': 63 | switch(Number(state.Calendar.now.world)) { 64 | case 1: 65 | getFaerunOrdinal(msg); 66 | break; 67 | case 2: 68 | getGreyhawkOrdinal(msg); 69 | break; 70 | case 3: 71 | getModernOrdinal(msg); 72 | break; 73 | case 4: 74 | getEberronOrdinal(msg); 75 | break; 76 | } 77 | weather(); 78 | calmenu(); 79 | break; 80 | case '!setmonth': 81 | switch(Number(state.Calendar.now.world)) { 82 | case 1: 83 | getFaerunOrdinal(msg); 84 | break; 85 | case 2: 86 | getGreyhawkOrdinal(msg); 87 | break; 88 | case 3: 89 | getModernOrdinal(msg); 90 | break; 91 | case 4: 92 | getEberronOrdinal(msg); 93 | break; 94 | } 95 | weather(); 96 | calmenu(); 97 | break; 98 | case '!setyear': 99 | state.Calendar.now.year=args[1]; 100 | calmenu(); 101 | break; 102 | case '!setordinal': 103 | state.Calendar.now.ordinal=args[1]; 104 | calmenu(); 105 | break; 106 | case '!settime': 107 | state.Calendar.now.time=args[1]; 108 | calmenu(); 109 | break; 110 | case '!setdown': 111 | var down = Number(args[1]); 112 | state.Calendar.now.down = down; 113 | getdown(down); 114 | calmenu(); 115 | break; 116 | case '!setdiv': 117 | state.Calendar.now.divider=Number(args[1]); 118 | calmenu(); 119 | break; 120 | case '!addday': 121 | addday(args[1]); 122 | weather(); 123 | calmenu(); 124 | break; 125 | case '!weather': 126 | if(args[1]=='Roll}'){ 127 | weather(); 128 | }else{ 129 | var string = args[1]; 130 | for (var i = 2; i < args.length; i++) { 131 | string = string + ", " + args[i]; 132 | } 133 | state.Calendar.now.weather = string; 134 | } 135 | calmenu(); 136 | break; 137 | case '!playercal': 138 | showcal(msg); 139 | break; 140 | case '!test': 141 | checkLeap(); 142 | break; 143 | } 144 | }else if(args[0]=='!cal'){ 145 | showcal(msg); 146 | } 147 | }, 148 | 149 | calmenu = function() { 150 | var colour = '#7E2D40'; 151 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 152 | var astyle1 = 'style="text-align:center; border: 1px solid black; margin: 1px; padding: 2px; background-color: ' + colour + '; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 100px;'; 153 | var astyle2 = 'style="text-align:center; border: 1px solid black; margin: 1px; padding: 2px; background-color: ' + colour + '; border-radius: 4px; box-shadow: 1px 1px 1px #707070; width: 150px;'; 154 | var tablestyle = 'style="text-align:center;"'; 155 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid ' + colour + '; margin-bottom: 2px; margin-top: 2px;"'; 156 | var headstyle = 'style="color: ' + colour + '; font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 157 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 158 | 159 | var world = getworld(); 160 | var down = Number(state.Calendar.now.down); 161 | down = getdown(down); 162 | var moMenu = getMoMenu(); 163 | var ordinal = state.Calendar.now.ordinal; 164 | 165 | var nowdate; 166 | 167 | switch(Number(state.Calendar.now.world)) { 168 | case 1: 169 | nowdate = getFaerunDate(ordinal).split(','); 170 | break; 171 | case 2: 172 | nowdate = getGreyhawkDate(ordinal).split(','); 173 | break; 174 | case 3: 175 | nowdate = getModernDate(ordinal).split(','); 176 | break; 177 | case 4: 178 | nowdate = getEberronDate(ordinal).split(','); 179 | break; 180 | } 181 | 182 | var month = nowdate[0]; 183 | var day = nowdate[1]; 184 | 185 | var moon; 186 | 187 | if (state.Calendar.now.world==1){ 188 | moon = getFaerunMoon(); 189 | }else if(state.Calendar.now.world==2){ 190 | moon = getGreyhawkMoon(); 191 | }else{ 192 | moon = ''; 193 | } 194 | 195 | var start = state.Calendar.now.startdate.split(','); 196 | var startdate = start[0]+getsuffix(start[0])+' '+start[1]+', '+start[2]; 197 | 198 | sendChat('Calendar', '/w gm
' + //-- 199 | '
Calendar
' + //-- 200 | '
Menu
' + //-- 201 | '
' + //-- 202 | '' + //-- 203 | '' + //-- 204 | '' + //-- 205 | '' + //-- 206 | '' + //-- 208 | //'' + //- 209 | '' + //- 210 | '' + //-- 211 | '' + //-- 212 | '
World: ' + world + '
Start Date: ' + startdate + '
Day: ' + day + '
Month: ' + state.Calendar.now.year + '
Ordinal: ' + ordinal + '
Time: ' + state.Calendar.now.time + '
Down Days: ' + down + '
Down Day
Divider:
' + state.Calendar.now.divider + '
' + //-- 213 | '
Weather: ' + state.Calendar.now.weather + //-- 214 | '

' + moon + //-- 215 | '

' + //-- 216 | '' + //-- 217 | '' + //-- 218 | '
' 219 | ); 220 | }, 221 | 222 | showcal = function(msg) { 223 | var nowdate; 224 | var ordinal = state.Calendar.now.ordinal; 225 | 226 | switch(Number(state.Calendar.now.world)) { 227 | case 1: 228 | nowdate = getFaerunDate(ordinal).split(','); 229 | break; 230 | case 2: 231 | nowdate = getGreyhawkDate(ordinal).split(','); 232 | break; 233 | case 3: 234 | nowdate = getModernDate(ordinal).split(','); 235 | break; 236 | case 4: 237 | nowdate = getEberronDate(ordinal).split(','); 238 | break; 239 | } 240 | 241 | var month = nowdate[0]; 242 | var day = nowdate[1]; 243 | var down = state.Calendar.now.down; 244 | down = getdown(down); 245 | var suffix = getsuffix(day); 246 | var world = getworld(); 247 | var divstyle = 'style="width: 189px; border: 1px solid black; background-color: #ffffff; padding: 5px;"' 248 | var tablestyle = 'style="text-align:center;"'; 249 | var arrowstyle = 'style="border: none; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 195px solid rgb(126, 45, 64); margin-bottom: 2px; margin-top: 2px;"'; 250 | var headstyle = 'style="color: rgb(126, 45, 64); font-size: 18px; text-align: left; font-variant: small-caps; font-family: Times, serif;"'; 251 | var substyle = 'style="font-size: 11px; line-height: 13px; margin-top: -3px; font-style: italic;"'; 252 | var moon; 253 | 254 | if (state.Calendar.now.world==1){ 255 | moon = getFaerunMoon(); 256 | }else if(state.Calendar.now.world==2){ 257 | moon = getGreyhawkMoon(); 258 | }else{ 259 | moon = ''; 260 | } 261 | 262 | var timestr; 263 | var downstr; 264 | 265 | if(state.Calendar.now.time!="OFF"){ 266 | timestr = '
The time is: '+state.Calendar.now.time; 267 | }else{ 268 | timestr = ''; 269 | } 270 | 271 | if(down!=0){ 272 | downstr = '
Players have ' + down + ' down days.'; 273 | }else{ 274 | downstr = ''; 275 | } 276 | 277 | sendChat(msg.who, '
' + //-- 278 | '
Calendar
' + //-- 279 | '
' + world + '
' + //-- 280 | '
' + //-- 281 | day + suffix + ' ' + month + ', ' + state.Calendar.now.year + //-- 282 | timestr + //-- 283 | downstr + //-- 284 | '

Today\'s weather:
' + state.Calendar.now.weather + //-- 285 | '

' + moon 286 | ); 287 | }, 288 | 289 | getworld = function() { 290 | var num = Number(state.Calendar.now.world); 291 | var world; 292 | 293 | switch(num) { 294 | case 1: 295 | world = 'Faerûn'; 296 | break; 297 | case 2: 298 | world = 'Greyhawk'; 299 | break; 300 | case 3: 301 | world = 'Modern'; 302 | break; 303 | case 4: 304 | world = 'Eberron'; 305 | break; 306 | } 307 | 308 | return world; 309 | }, 310 | 311 | getdown = function(days) { 312 | var down = Number(days); 313 | var div = Number(state.Calendar.now.divider); 314 | 315 | if(div!=0){ 316 | down = down/div; 317 | } 318 | 319 | return down; 320 | }, 321 | 322 | getMoMenu = function() { 323 | var world = Number(state.Calendar.now.world); 324 | var leap = checkLeap(); 325 | var moMenu; 326 | 327 | switch(world){ 328 | case 1: 329 | if(leap==0){ 330 | moMenu = ',?{Month|Hammer|Midwinter|Alturiak|Ches|Tarsakh|Greengrass|Mirtul|Kythorn|Flamerule|Midsummer|Eleasias|Eleint|Highharvestide|Marpenoth|Uktar|Feast of the Moon|Nightal}">'; 331 | }else{ 332 | moMenu = ',?{Month|Hammer|Midwinter|Alturiak|Ches|Tarsakh|Greengrass|Mirtul|Kythorn|Flamerule|Midsummer|Sheildmeet|Eleasias|Eleint|Highharvestide|Marpenoth|Uktar|Feast of the Moon|Nightal}">'; 333 | } 334 | break; 335 | case 2: 336 | moMenu = ',?{Month|Needfest|Fire Seek|Readying|Coldeven|Growfest|Planting|Flocktime|Wealsun|Richfest|Reaping|Goodmonth|Harvester|Brewfest|Patchwall|Readyreat|Sunsebb}">'; 337 | break; 338 | case 3: 339 | moMenu = ',?{Month|January|February|March|April|May|June|July|August|September|October|November|December}">'; 340 | break; 341 | case 4: 342 | moMenu = ',?{Month|Zarantyr|Olarune|Therendor|Eyre|Dravago|Nymm|Lharvion|Barrakas|Rhaan|Sypheros|Aryth|Vult}">'; 343 | break; 344 | } 345 | 346 | return moMenu; 347 | }, 348 | 349 | checkLeap = function(){ 350 | 351 | var leap; 352 | var remainder; 353 | var world = Number(state.Calendar.now.world); 354 | var year = Number(state.Calendar.now.year); 355 | 356 | switch(world){ 357 | case 1: 358 | remainder = year % 4; 359 | if(remainder==0){ 360 | leap = 1; 361 | }else{ 362 | leap = 0; 363 | } 364 | break; 365 | case 2: 366 | leap = 0; 367 | break; 368 | case 3: 369 | if(year % 4 != 0){ 370 | leap = 0; 371 | }else if(year % 100 != 0){ 372 | leap = 1; 373 | }else if(year % 400 != 0){ 374 | leap = 0; 375 | }else{ 376 | leap = 1; 377 | } 378 | break; 379 | case 4: 380 | leap = 0; 381 | break; 382 | } 383 | 384 | return leap; 385 | }, 386 | 387 | getFaerunDate = function(options){ 388 | var day = Number(options); 389 | var date; 390 | var month; 391 | 392 | if(day>0 && day<=30){ 393 | month="Hammer"; 394 | date=day; 395 | }else if(day==31){ 396 | month="Midwinter"; 397 | date='festival'; 398 | }else if(day>31 && day<=61){ 399 | month="Alturiak"; 400 | date=day-31; 401 | }else if(day>61 && day<=91){ 402 | month="Ches"; 403 | date=day-61; 404 | }else if(day>91 && day<=121){ 405 | month="Tarsakh"; 406 | date=day-91; 407 | }else if(day==122){ 408 | month="Greengrass"; 409 | date='festival'; 410 | }else if(day>122 && day<=152){ 411 | month="Mirtul"; 412 | date=day-122; 413 | }else if(day>152 && day<=182){ 414 | month="Kythorn"; 415 | date=day-152; 416 | }else if(day>182 && day<=212){ 417 | month="Flamerule"; 418 | date=day-182; 419 | }else if(day==213){ 420 | month="Midsummer"; 421 | date='festival'; 422 | }else if(day==214){ 423 | month="Sheildmeet"; 424 | date='festival'; 425 | }else if(day>214 && day<=244){ 426 | month="Eleasias" 427 | date=day-214; 428 | }else if(day>244 && day<=274){ 429 | month="Eleint"; 430 | date=day-244; 431 | }else if(day==275){ 432 | month="Highharvestide"; 433 | date='festival'; 434 | }else if(day>275 && day<=305){ 435 | month="Marpenoth"; 436 | date=day-275; 437 | }else if(day>305 && day<=335){ 438 | month="Uktar"; 439 | date=day-305; 440 | }else if(day==336){ 441 | month="Feast of the Moon"; 442 | date='festival'; 443 | }else if(day>336 && day<=366){ 444 | month="Nightal"; 445 | date=day-336; 446 | }else{ 447 | month="Hammer"; 448 | date='1'; 449 | } 450 | 451 | var array=month+','+String(date); 452 | return array; 453 | }, 454 | 455 | getGreyhawkDate = function(options){ 456 | var day = Number(options); 457 | var date; 458 | var month; 459 | 460 | if(day>0 && day<=7){ 461 | month="Needfest"; 462 | date=day; 463 | }else if(day>7 && day<=35){ 464 | month="Fire Seek"; 465 | date=day-7; 466 | }else if(day>35 && day<=63){ 467 | month="Readying"; 468 | date=day-35; 469 | }else if(day>63 && day<=91){ 470 | month="Coldeven"; 471 | date=day-63; 472 | }else if(day>91 && day<=98){ 473 | month="Growfest"; 474 | date=day-91; 475 | }else if(day>98 && day<=126){ 476 | month="Planting"; 477 | date=day-98; 478 | }else if(day>126 && day<=154){ 479 | month="Flocktime"; 480 | date=day-126; 481 | }else if(day>154 && day<=182){ 482 | month="Wealsun"; 483 | date=day-154; 484 | }else if(day>182 && day<=189){ 485 | month="Richfest"; 486 | date=day-182; 487 | }else if(day>189 && day<=217){ 488 | month="Reaping"; 489 | date=day-189; 490 | }else if(day>217 && day<=245){ 491 | month="Goodmonth" 492 | date=day-217; 493 | }else if(day>245 && day<=273){ 494 | month="Harvester"; 495 | date=day-245; 496 | }else if(day>273 && day<=280){ 497 | month="Brewfest"; 498 | date=day-273; 499 | }else if(day>280 && day<=308){ 500 | month="Patchwall"; 501 | date=day-280; 502 | }else if(day>308 && day<=336){ 503 | month="Readyreat"; 504 | date=day-308; 505 | }else if(day>336 && day<=364){ 506 | month="Sunsebb"; 507 | date=day-336; 508 | }else{ 509 | month="Needfest"; 510 | date='1'; 511 | } 512 | 513 | var array=month+','+String(date); 514 | return array; 515 | }, 516 | 517 | getModernDate = function(options){ 518 | var day = Number(options); 519 | var date; 520 | var month; 521 | 522 | if(day>0 && day<=31){ 523 | month="January"; 524 | date=day; 525 | }else if(day>31 && day<=59){ 526 | month="February"; 527 | date=day-31; 528 | }else if(day>59 && day<=90){ 529 | month="March"; 530 | date=day-59; 531 | }else if(day>90 && day<=120){ 532 | month="April"; 533 | date=day-90; 534 | }else if(day>120 && day<=151){ 535 | month="May"; 536 | date=day-120; 537 | }else if(day>151 && day<=181){ 538 | month="June"; 539 | date=day-151; 540 | }else if(day>181 && day<=212){ 541 | month="July"; 542 | date=day-181; 543 | }else if(day>212 && day<=243){ 544 | month="August"; 545 | date=day-212; 546 | }else if(day>243 && day<=273){ 547 | month="September"; 548 | date=day-243; 549 | }else if(day>273 && day<=304){ 550 | month="October"; 551 | date=day-273; 552 | }else if(day>304 && day<=334){ 553 | month="November" 554 | date=day-304; 555 | }else if(day>334 && day<=365){ 556 | month="December"; 557 | date=day-334; 558 | }else{ 559 | month="January"; 560 | date='1'; 561 | } 562 | 563 | var array=month+','+String(date); 564 | return array; 565 | }, 566 | 567 | getEberronDate = function(options){ 568 | var day = Number(options); 569 | var date; 570 | var month; 571 | 572 | if(day<=28){ 573 | month = 'Zarantyr'; 574 | date = day; 575 | }else if(day<=56){ 576 | month = 'Olarune'; 577 | date = day-28; 578 | }else if(day<=84){ 579 | month = 'Therendor'; 580 | date = day-56; 581 | }else if(day<=112){ 582 | month = 'Eyre'; 583 | date = day-84; 584 | }else if(day<=140){ 585 | month = 'Dravago'; 586 | date = day-112; 587 | }else if(day<=168){ 588 | month = 'Nymm'; 589 | date = day-140; 590 | }else if(day<=196){ 591 | month = 'Lharvion'; 592 | date = day-168; 593 | }else if(day<=224){ 594 | month = 'Rhaan'; 595 | date = day-196; 596 | }else if(day<=252){ 597 | month = 'Sypheros'; 598 | date = day-224; 599 | }else if(day<=280){ 600 | month = 'Aryth'; 601 | date = day-252; 602 | }else if(day<=308){ 603 | month = 'Vult'; 604 | date = day-280; 605 | }else{ 606 | month = 'Zarantyr'; 607 | date = 1; 608 | } 609 | 610 | var array=month+','+String(date); 611 | return array; 612 | }, 613 | 614 | getFaerunOrdinal = function(options){ 615 | var args = options.content.split(","); 616 | var date = args[1]; 617 | var month = args[2]; 618 | var ordinal = state.Calendar.now.ordinal; 619 | 620 | if(date == 'festival'){ 621 | date = 1; 622 | }else{ 623 | date = Number(args[1]); 624 | } 625 | 626 | switch(month) { 627 | case 'Hammer': 628 | ordinal = date; 629 | break; 630 | case 'Midwinter': 631 | ordinal = 31; 632 | break; 633 | case 'Alturiak': 634 | ordinal = 31+date; 635 | break; 636 | case 'Ches': 637 | ordinal = 61+date; 638 | break; 639 | case 'Tarsakh': 640 | ordinal = 91+date; 641 | break; 642 | case 'Greengrass': 643 | ordinal = 122; 644 | break; 645 | case 'Mirtul': 646 | ordinal = 122+date; 647 | break; 648 | case 'Kythorn': 649 | ordinal = 152+date; 650 | break; 651 | case 'Flamerule': 652 | ordinal = 182+date; 653 | break; 654 | case 'Midsummer': 655 | ordinal = 213; 656 | break; 657 | case 'Sheildmeet': 658 | ordinal = 214; 659 | break; 660 | case 'Eleasias': 661 | ordinal = 214+date; 662 | break; 663 | case 'Eleint': 664 | ordinal = 244+date; 665 | break; 666 | case 'Highharvestide': 667 | ordinal = 275; 668 | break; 669 | case 'Marpenoth': 670 | ordinal = 275+date; 671 | break; 672 | case 'Uktar': 673 | ordinal = 305+date; 674 | break; 675 | case 'Feast of the Moon': 676 | ordinal = 335+date; 677 | break; 678 | case 'Nightal': 679 | ordinal = 336+date; 680 | break; 681 | } 682 | state.Calendar.now.ordinal = ordinal; 683 | }, 684 | 685 | getGreyhawkOrdinal = function(options){ 686 | var args = options.content.split(","); 687 | var date = args[1]; 688 | var month = args[2]; 689 | var ordinal = state.Calendar.now.ordinal; 690 | 691 | if(date == 'festival'){ 692 | date = 1; 693 | }else{ 694 | date = Number(args[1]); 695 | } 696 | 697 | switch(month) { 698 | case 'Needfest': 699 | ordinal = date; 700 | break; 701 | case 'Fire Seek': 702 | ordinal = 7+date; 703 | break; 704 | case 'Readying': 705 | ordinal = 35+date; 706 | break; 707 | case 'Coldeven': 708 | ordinal = 63+date; 709 | break; 710 | case 'Growfest': 711 | ordinal = 91+date; 712 | break; 713 | case 'Planting': 714 | ordinal = 98+date; 715 | break; 716 | case 'Flocktime': 717 | ordinal = 126+date; 718 | break; 719 | case 'Wealsun': 720 | ordinal = 154+date; 721 | break; 722 | case 'Richfest': 723 | ordinal = 182+date; 724 | break; 725 | case 'Reaping': 726 | ordinal = 189+date; 727 | break; 728 | case 'Goodmonth': 729 | ordinal = 217+date; 730 | break; 731 | case 'Harvester': 732 | ordinal = 245+date; 733 | break; 734 | case 'Brewfest': 735 | ordinal = 273+date; 736 | break; 737 | case 'Patchwall': 738 | ordinal = 280+date; 739 | break; 740 | case 'Readyreat': 741 | ordinal = 308+date; 742 | break; 743 | case 'Sunsebb': 744 | ordinal = 336+date; 745 | break; 746 | } 747 | state.Calendar.now.ordinal = ordinal; 748 | }, 749 | 750 | getModernOrdinal = function(options){ 751 | var args = options.content.split(","); 752 | var date = Number(args[1]); 753 | var month = args[2]; 754 | var ordinal = state.Calendar.now.ordinal; 755 | 756 | switch(month) { 757 | case 'January': 758 | ordinal = date; 759 | break; 760 | case 'February': 761 | ordinal = 31+date; 762 | break; 763 | case 'March': 764 | ordinal = 60+date; 765 | break; 766 | case 'April': 767 | ordinal = 91+date; 768 | break; 769 | case 'May': 770 | ordinal = 121+date; 771 | break; 772 | case 'June': 773 | ordinal = 152+date; 774 | break; 775 | case 'July': 776 | ordinal = 182+date; 777 | break; 778 | case 'August': 779 | ordinal = 213+date; 780 | break; 781 | case 'September': 782 | ordinal = 244+date; 783 | break; 784 | case 'October': 785 | ordinal = 274+date; 786 | break; 787 | case 'November': 788 | ordinal = 305+date; 789 | break; 790 | case 'December': 791 | ordinal = 366+date; 792 | break; 793 | } 794 | state.Calendar.now.ordinal = ordinal; 795 | }, 796 | 797 | getEberronOrdinal = function(options){ 798 | var args = options.content.split(","); 799 | var date = Number(args[1]); 800 | var month = args[2]; 801 | var ordinal = state.Calendar.now.ordinal; 802 | 803 | switch(month) { 804 | case 'Zarantyr': 805 | ordinal = date; 806 | break; 807 | case 'Olarune': 808 | ordinal = 28+date; 809 | break; 810 | case 'Therendor': 811 | ordinal = 56+date; 812 | break; 813 | case 'Eyre': 814 | ordinal = 84+date; 815 | break; 816 | case 'Dravago': 817 | ordinal = 112+date; 818 | break; 819 | case 'Nymm': 820 | ordinal = 140+date; 821 | break; 822 | case 'Lharvion': 823 | ordinal = 168+date; 824 | break; 825 | case 'Barrakas': 826 | ordinal = 196+date; 827 | break; 828 | case 'Rhaan': 829 | ordinal = 224+date; 830 | break; 831 | case 'Sypheros': 832 | ordinal = 252+date; 833 | break; 834 | case 'Aryth': 835 | ordinal = 280+date; 836 | break; 837 | case 'Vult': 838 | ordinal = 308+date; 839 | break; 840 | } 841 | state.Calendar.now.ordinal = ordinal; 842 | }, 843 | 844 | addday = function(no){ 845 | var leap = checkLeap(); 846 | var days = Number(no); 847 | var ordinal = Number(state.Calendar.now.ordinal); 848 | var world = Number(state.Calendar.now.world); 849 | var div = state.Calendar.now.div; 850 | 851 | if(div!=0){ 852 | state.Calendar.now.down = Number(state.Calendar.now.down)+days; 853 | } 854 | 855 | var newordinal = ordinal+days; 856 | 857 | switch(world){ 858 | case 1: 859 | if(leap==0 && ordinal <= 214 && newordinal >= 214){ 860 | state.Calendar.now.ordinal = newordinal+1; 861 | }else{ 862 | state.Calendar.now.ordinal = newordinal; 863 | } 864 | 865 | if(ordinal>366){ 866 | ordinal=ordinal-366; 867 | state.Calendar.now.year = Number(state.Calendar.now.year)+1; 868 | } 869 | break; 870 | case 2: 871 | state.Calendar.now.ordinal = newordinal; 872 | break; 873 | case 3: 874 | if(leap==0 && ordinal <= 60 && newordinal >= 60){ 875 | state.Calendar.now.ordinal = newordinal+1; 876 | }else{ 877 | state.Calendar.now.ordinal = newordinal; 878 | } 879 | case 4: 880 | state.Calendar.now.ordinal = newordinal; 881 | break; 882 | } 883 | }, 884 | 885 | 886 | 887 | getsuffix = function(day) { 888 | 889 | var date = Number(day) 890 | var suffix 891 | 892 | if (date == 1 || date == 21 ){ 893 | suffix = 'st'; 894 | }else if (date == 2 || date == 22){ 895 | suffix = 'nd'; 896 | }else if (date == 3 || date == 23){ 897 | suffix = 'rd'; 898 | }else{ 899 | suffix = 'th'; 900 | } 901 | 902 | return suffix; 903 | }, 904 | 905 | weather = function() { 906 | var roll; 907 | var temperature; 908 | var wind; 909 | var precipitation; 910 | var season; 911 | var ordinal = state.Calendar.now.ordinal; 912 | 913 | if(ordinal > 349 || ordinal <= 75){ 914 | season = 'Winter' 915 | }else if(ordinal <= 166){ 916 | season = 'Spring' 917 | }else if(ordinal <=257 ){ 918 | season = 'Summer' 919 | }else if(ordinal <=349 ){ 920 | season = 'Fall' 921 | } 922 | 923 | roll = Math.floor(Math.random()*(20-1+1)+1); 924 | if(roll>=15 && roll<=17){ 925 | switch(season) { 926 | case 'Winter': 927 | temperature = 'It is a bitterly cold winter day. '; 928 | break; 929 | case 'Spring': 930 | temperature = 'It is a cold spring day. '; 931 | break; 932 | case 'Summer': 933 | temperature = 'It is a cool summer day. '; 934 | break; 935 | case 'Fall': 936 | temperature = 'It is a cold fall day. '; 937 | break; 938 | } 939 | }else if(roll>=18 && roll<=20){ 940 | switch(season) { 941 | case 'Winter': 942 | temperature = 'It is a warm winter day. '; 943 | break; 944 | case 'Spring': 945 | temperature = 'It is a hot spring day. '; 946 | break; 947 | case 'Summer': 948 | temperature = 'It is a blisteringly hot summer day. '; 949 | break; 950 | case 'Fall': 951 | temperature = 'It is a hot fall day. '; 952 | break; 953 | } 954 | }else{ 955 | switch(season) { 956 | case 'Winter': 957 | temperature = 'It is a cold winter day. '; 958 | break; 959 | case 'Spring': 960 | temperature = 'It is a mild spring day. '; 961 | break; 962 | case 'Summer': 963 | temperature = 'It is a hot summer day. '; 964 | break; 965 | case 'Fall': 966 | temperature = 'It is a mild fall day. '; 967 | break; 968 | } 969 | 970 | } 971 | 972 | roll = Math.floor(Math.random()*(20-1+1)+1); 973 | if(roll>=15 && roll<=17){ 974 | wind='There is a light breeze and '; 975 | }else if(roll>=18 && roll<=20){ 976 | wind='There is a howling wind and '; 977 | }else{ 978 | wind='The air is still and '; 979 | } 980 | 981 | roll = Math.floor(Math.random()*(20-1+1)+1); 982 | if(roll>=15 && roll<=17){ 983 | precipitation="Light rain or snow."; 984 | if(season=='Winter'){ 985 | precipitation = 'snow falls softly on the ground.'; 986 | }else{ 987 | precipitation = 'a light rain falls from the sky.'; 988 | } 989 | }else if(roll>=18 && roll<=20){ 990 | if(season=='Winter'){ 991 | precipitation = 'snow falls thick and fast from the sky.'; 992 | }else{ 993 | precipitation = 'a torrential rain begins to fall.'; 994 | } 995 | }else{ 996 | roll = Math.floor(Math.random()*(2-1+1)+1); 997 | if(roll=1){ 998 | precipitation = 'the sky is overcast.'; 999 | }else{ 1000 | precipitation = 'the sky is clear.'; 1001 | } 1002 | } 1003 | 1004 | var forecast=temperature+wind+precipitation; 1005 | state.Calendar.now.weather = forecast; 1006 | }, 1007 | 1008 | getFaerunMoon = function() { 1009 | var year = state.Calendar.now.year; 1010 | var ordinal = Number(state.Calendar.now.ordinal); 1011 | var moonOrdinal; 1012 | var moon; 1013 | 1014 | var remainder = year/4 - Math.floor(year/4); 1015 | if(remainder==0.25) { 1016 | moonOrdinal=ordinal; 1017 | }else if (remainder==0.5) { 1018 | moonOrdinal=ordinal+365; 1019 | }else if (remainder==0.75) { 1020 | moonOrdinal=ordinal+730; 1021 | }else if (remainder==0) { 1022 | moonOrdinal=ordinal+1095; 1023 | } 1024 | 1025 | var today = ordinal/30.4375 - Math.floor(ordinal/30.4375); 1026 | var tomorrow = (ordinal+1)/30.4375 - Math.floor((ordinal+1)/30.4375); 1027 | var perc = today + ',' + tomorrow + ',' + moonOrdinal; 1028 | 1029 | moon = getMoon(perc); 1030 | 1031 | return moon; 1032 | }, 1033 | 1034 | getGreyhawkMoon = function() { 1035 | var ordinal = Number(state.Calendar.now.ordinal); 1036 | var today; 1037 | var tomorrow; 1038 | var LunaOrd = ordinal + 10; 1039 | var CeleneOrd = ordinal + 87; 1040 | 1041 | today = LunaOrd/28 - Math.floor(LunaOrd/28); 1042 | tomorrow = (LunaOrd+1)/28 - Math.floor((LunaOrd+1)/28); 1043 | var perc = today + ',' + tomorrow + ',' + 0; 1044 | var Luna = getMoon(perc); 1045 | 1046 | today = CeleneOrd/91 - Math.floor(CeleneOrd/91); 1047 | tomorrow = (CeleneOrd+1)/91 - Math.floor((CeleneOrd+1)/91); 1048 | perc = today + ',' + tomorrow + ',' + 0; 1049 | var Celene = getMoon(perc) 1050 | 1051 | var moon = 'Luna: '+Luna+'
Celene: '+Celene; 1052 | 1053 | return moon; 1054 | }, 1055 | 1056 | getMoon = function(perc) { 1057 | var args = perc.split(','); 1058 | var today = args[0]; 1059 | var tomorrow = args[1]; 1060 | var moonOrdinal = args[2]; 1061 | var moon; 1062 | 1063 | if(today==0 || tomorrow0.25){ 1066 | moon = 'Last Quarter'; 1067 | }else if(today<0.25){ 1068 | moon = 'Waning Gibbous'; 1069 | }else if(today<=0.5 && tomorrow>0.5){ 1070 | moon = 'New Moon'; 1071 | }else if(today<0.5){ 1072 | moon = 'Waning Crescent'; 1073 | }else if(today<=0.75 && tomorrow>0.75){ 1074 | moon = 'First Quarter'; 1075 | }else if(today<0.75){ 1076 | moon = 'Waxing Crescent'; 1077 | }else{ 1078 | moon = 'Waxing Gibbous'; 1079 | } 1080 | 1081 | return moon; 1082 | }, 1083 | 1084 | checkInstall = function() { 1085 | if( ! state.Calendar.now.version ) { 1086 | setDefaults(); 1087 | } 1088 | 1089 | if ( state.Calendar.now.version != version ){ 1090 | checkDefaults(); 1091 | } 1092 | }, 1093 | 1094 | registerEventHandlers = function() { 1095 | on('chat:message', handleInput); 1096 | }; 1097 | 1098 | return { 1099 | CheckInstall: checkInstall, 1100 | RegisterEventHandlers: registerEventHandlers 1101 | }; 1102 | 1103 | }()); 1104 | 1105 | on("ready",function(){ 1106 | 'use strict'; 1107 | Calendar.CheckInstall(); 1108 | Calendar.RegisterEventHandlers(); 1109 | }); 1110 | --------------------------------------------------------------------------------